DEV Community

gaurbprajapati
gaurbprajapati

Posted on

block scope and shadowing in Javascript

Block Scope:

Block scope refers to the visibility and accessibility of variables within a specific block of code. A block is denoted by curly braces {} and can include if statements, loops, and any other code enclosed within them. Variables declared inside a block are limited in scope to that block and are not accessible outside of it.

Block scope was introduced in JavaScript with the let and const keywords in ECMAScript 6 (ES6). Prior to ES6, JavaScript had only function scope with the var keyword.

Let's see an example to understand block scope in JavaScript:

function myFunction() {
  if (true) {
    let x = 10; // Block-scoped variable
    console.log(x); // Output: 10
  }
  console.log(x); // Error: x is not defined
}

myFunction();
Enter fullscreen mode Exit fullscreen mode

In this example, the variable x is declared within the if block using the let keyword. It has block scope, meaning it is accessible only within the block in which it is declared. Inside the if block, the value of x is 10, and the console.log statement within the block prints 10. However, when we try to access x outside of the block, an error is thrown because x is not defined in that scope.

Block scope allows for better control and encapsulation of variables, preventing unintentional variable access or modification outside of the intended block.

Shadowing:

Shadowing occurs when a variable in an inner scope has the same name as a variable in an outer scope. The inner variable "shadows" or overrides the outer variable, making it inaccessible within the inner scope. This can lead to unexpected behavior if not managed carefully.

Let's see an example to understand shadowing in JavaScript:

let x = 10;

function myFunction() {
  let x = 20; // Shadowing the outer variable
  console.log(x); // Output: 20
}

myFunction();

console.log(x); // Output: 10
Enter fullscreen mode Exit fullscreen mode

In this code, we have a global variable x declared with a value of 10. Inside the myFunction function, there is another variable x declared with a value of 20. This inner variable shadows the outer variable, meaning that within the function scope of myFunction, references to x will resolve to the inner variable rather than the global variable.

When we invoke the myFunction function, it prints the value of the inner variable x, which is 20. However, when we try to access x outside the function, it refers to the global variable, and the value remains 10.

Here's a complex code example to explain shadowing in JavaScript:

let x = 10;

function outer() {
  let y = 20;

  function inner() {
    let x = 30; // Shadowing the outer `x`
    let z = 40;

    console.log(x); // Output: 30
    console.log(y); // Output: 20
    console.log(z); // Output: 40
  }

  inner();

  console.log(x); // Output: 10
  console.log(y); // Output: 20
}

outer();

console.log(x); // Output: 10
Enter fullscreen mode Exit fullscreen mode

In this example, we have three nested levels of function scopes: global scope, outer function scope, and inner function scope. Each scope has its own set of variables.

  • The global scope contains a variable x with a value of 10.
  • The outer function scope contains a variable y with a value of 20.
  • The inner function scope contains a variable x with a value of 30 and a variable z with a value of 40.

When the inner function is invoked, it logs the value of x, which is 30 within its own scope, and the values of y and z from its outer scope.

After the inner function is executed, the outer function continues executing and logs the value of x, which is 10 from the global scope, and the value of y from its own scope.

Finally, outside all function scopes, the global x value is logged, which is 10.

This example demonstrates how the concept of shadowing allows variables with the same name to exist in different scopes and be accessed independently. The inner x variable shadows the outer x variable, allowing the code to have separate variables with the same name but different values within each scope.

Shadowing can be useful when you want to create local variables that are independent of variables in outer scopes. However, it is essential to be mindful of potential confusion and unintended consequences, such as accidentally accessing the wrong variable due to shadowing.

Shadowing can lead to confusion and bugs if not managed properly. It is important to be aware of variable naming and avoid unintentional shadowing. Using descriptive and unique variable names can help minimize the chances of shadowing and make the code more readable and maintainable.

In summary, block scope allows variables to be limited to specific blocks of code, improving encapsulation and preventing unintended access. Shadowing occurs when a variable in an inner scope has the same name as a variable in an outer scope, effectively hiding the outer variable within the inner scope. Both concepts are essential to understand for writing clean and reliable JavaScript code.

Top comments (1)

Collapse
 
efrenmarin profile image
Efren Marin

A great quick and easy to understand interpretation of block scoping.