DEV Community

Cover image for 📚 Understanding JavaScript Scope and Hoisting
Artem Turlenko
Artem Turlenko

Posted on

📚 Understanding JavaScript Scope and Hoisting

Understanding JavaScript Scope and Hoisting

Scope and hoisting are essential JavaScript concepts that affect how variables and functions behave in your code. Having a solid understanding of these concepts can significantly improve your coding skills and reduce bugs.

What is Scope in JavaScript?

Scope determines the visibility and accessibility of variables within your code. JavaScript mainly has three types of scope:

1. Global Scope

Variables declared globally (outside of any function) have global scope and are accessible everywhere in your JavaScript file.

let globalVar = 'I am global';

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

logVar(); // Output: I am global
Enter fullscreen mode Exit fullscreen mode

2. Local (Function) Scope

Variables declared within a function are only accessible within that function.

function example() {
  let localVar = 'I am local';
  console.log(localVar); // Accessible here
}

example(); // Output: I am local
// console.log(localVar); // Uncaught ReferenceError: localVar is not defined
Enter fullscreen mode Exit fullscreen mode

3. Block Scope (Introduced with ES6)

Variables declared with let and const inside a block {} are accessible only within that block.

if (true) {
  let blockVar = 'I exist only in this block';
  console.log(blockVar); // Accessible here
}

// console.log(blockVar); // Uncaught ReferenceError: blockVar is not defined
Enter fullscreen mode Exit fullscreen mode

What is Hoisting?

Hoisting is JavaScript's default behavior of moving declarations to the top of their scope before code execution.

Variable Hoisting

Variables declared with var are hoisted and initialized as undefined. Variables declared with let and const are hoisted but not initialized.

console.log(a); // undefined (hoisted, but initialized as undefined)
var a = 5;

// console.log(b); // ReferenceError: Cannot access 'b' before initialization
let b = 10;
Enter fullscreen mode Exit fullscreen mode

Function Hoisting

Function declarations are hoisted completely, allowing them to be called before their declaration.

hoistedFunction(); // Output: 'This function is hoisted'

function hoistedFunction() {
  console.log('This function is hoisted');
}
Enter fullscreen mode Exit fullscreen mode

However, function expressions are not hoisted:

// notHoisted(); // TypeError: notHoisted is not a function

var notHoisted = function() {
  console.log('Function expression is not hoisted');
};
Enter fullscreen mode Exit fullscreen mode

Best Practices

  • Declare variables at the top of their scope to avoid confusion.
  • Prefer let and const over var to ensure clearer and more predictable scoping behavior.
  • Always declare and initialize variables before using them.

Final Thoughts

Understanding JavaScript scope and hoisting helps prevent common bugs and makes your code easier to manage and maintain.

Have you encountered tricky bugs related to scope or hoisting? Share your experiences below! 🚀

Heroku

Deploy with ease. Manage efficiently. Scale faster.

Leave the infrastructure headaches to us, while you focus on pushing boundaries, realizing your vision, and making a lasting impression on your users.

Get Started

Top comments (0)