Altcademy - a Forbes magazine logo Best Coding Bootcamp 2023

What is scope in JavaScript

Understanding the Concept of Scope

In JavaScript, and in programming in general, 'scope' refers to the visibility or accessibility of variables, functions, and objects in some particular part of your code during runtime. In other words, it defines the portion of the code where a variable or a function can be accessed.

The Analogy of Scope

Think of scope as a set of Russian nesting dolls. The outermost doll can be thought of as the global scope, which encapsulates all others. Each inner doll then represents a local scope that resides within the global one. You can access all the scopes from the global scope (the outermost doll), but as you go deeper into the dolls (or scopes), the visibility reduces.

Types of Scope in JavaScript

There are three types of scope in JavaScript: Global Scope, Function Scope, and Block Scope.

Global Scope

When you start writing code in a new JavaScript file, you are in what is known as the global scope. Any variable declared in this scope is known as a global variable and can be accessed from anywhere in your code.

var globalVar = "I'm a global variable";

function exampleFunction() {
  console.log(globalVar);
}

exampleFunction(); // Outputs: I'm a global variable

Function Scope

Every time a function is created in JavaScript, a new scope is created. This means that any variable declared inside that function cannot be accessed from outside the function. This is known as function scope, and the variable is known as a local variable.

function exampleFunction() {
  var localVar = "I'm a local variable";
  console.log(localVar);
}

exampleFunction(); // Outputs: I'm a local variable
console.log(localVar); // Uncaught ReferenceError: localVar is not defined

Block Scope

JavaScript ES6 introduced the concept of block scoping through the let and const keywords. A block scope is the area within if, switch conditions or for and while loops. Generally speaking, whenever you see {curly brackets}, it is a block.

if (true) {
  let blockVar = "I'm a block variable";
  console.log(blockVar);
}

console.log(blockVar); // Uncaught ReferenceError: blockVar is not defined

Scope Chain

In JavaScript, you can access variables of outer functions from an inner function, forming what we call a scope chain.

var globalVar = "I'm a global variable";

function outerFunction() {
  var outerVar = "I'm an outer variable";

  function innerFunction() {
    console.log(globalVar);
    console.log(outerVar);
  }

  innerFunction();
}

outerFunction(); 
// Outputs: I'm a global variable
// Outputs: I'm an outer variable

In the above example, innerFunction is able to access its own scope, the outer function's scope, and the global scope.

Hoisting

In JavaScript, variable and function declarations are "hoisted" to the top of their containing scope. However, only the declarations are hoisted, not initializations.

console.log(hoistedVar); // Outputs: undefined
var hoistedVar = "I'm a variable that's been hoisted";

In the above example, JavaScript has hoisted the declaration of hoistedVar to the top of the scope, before the console.log function executes.

In Conclusion

Understanding scope in JavaScript is crucial for writing effective and efficient code. It helps us manage and organize our variables and functions, and control where they can and can't be accessed from. So, next time you're tackling a complex function or trying to debug a piece of JavaScript, remember: scope is like a set of Russian dolls. It's all about figuring out which doll (or scope) you're working with at any given moment.