DEV Community

Akash Yadav
Akash Yadav

Posted on

Types of Scope in JavaScript

1. Global Scope:
-> Variables or functions declared outside of any function or block have global scope.
-> They can be accessed from anywhere in the code, including inside -> functions or blocks.
-> Global variables can create issues, especially in large programs, as they are accessible everywhere and can be overwritten.

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

function displayGlobalVar() {
  console.log(globalVar); // Accessible here
}

displayGlobalVar(); // Output: I'm a global variable
Enter fullscreen mode Exit fullscreen mode

2. Function Scope:
-> Variables declared within a function are scoped to that function.
They are not accessible outside the function in which they are defined

function myFunction() {
  var functionVar = "I'm a function variable";
  console.log(functionVar); // Accessible here
}

myFunction();
console.log(functionVar); // Error: functionVar is not defined
Enter fullscreen mode Exit fullscreen mode

-> In the example above, functionVar is not accessible outside of myFunction().

3. Block Scope (introduced in ES6):
-> Variables declared using let and const are block-scoped.
They are only accessible within the block (e.g., { }) in which they are defined.

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

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

Enter fullscreen mode Exit fullscreen mode

-> Variables declared with var, however, are not block-scoped; they are function-scoped.

if (true) {
  var notBlockVar = "I'm not block-scoped";
}

console.log(notBlockVar); // Output: I'm not block-scoped
Enter fullscreen mode Exit fullscreen mode

4. Lexical Scope:
-> Lexical scope (also known as static scope) refers to the fact that a function's scope is determined by where it is defined in the code, not where it is called.
-> Inner functions have access to variables of outer functions.

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

  function innerFunction() {
    console.log(outerVar); // Accessible here
  }

  innerFunction(); // Output: I'm an outer variable
}

outerFunction();
Enter fullscreen mode Exit fullscreen mode

5. Closures:
-> A closure is a function that retains access to its lexical scope, even when the function is executed outside that scope.
-> Closures allow a function to access variables from an outer function even after the outer function has returned.

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

  return function innerFunction() {
    console.log(outerVar); // Still accessible here
  };
}

var closureFunction = outerFunction();
closureFunction(); // Output: I'm an outer variable
Enter fullscreen mode Exit fullscreen mode

-> In the example above, innerFunction forms a closure that allows it to access outerVar even after outerFunction has finished executing.

Summary:

  1. Global Scope: Accessible from anywhere in the code.
  2. **Function Scope: **Accessible only within the function where defined.
  3. Block Scope: Accessible only within the block where defined (let, const).
  4. Lexical Scope: Functions have access to variables in the scope where they were defined.
  5. Closures: Functions that "remember" their lexical scope even after the outer function has finished.

-> Understanding scope is crucial for managing variable lifetimes and ensuring that your code behaves as expected.

Top comments (0)