DEV Community

Cover image for Understanding Hoisting in JavaScript
Md Readwan
Md Readwan

Posted on

Understanding Hoisting in JavaScript

Hoisting is one of the fundamental concepts in JavaScript that often confuses new developers. However, once understood, it can greatly help in writing and debugging JavaScript code. In this article, we'll demystify hoisting, explain how it works, and provide examples to illustrate its effects.

What is Hoisting?

In JavaScript, hoisting is the behavior where variable and function declarations are moved, or "hoisted," to the top of their containing scope (either the global scope or function scope) during the compile phase. This means you can use variables and functions before they are actually declared in the code.

Hoisting Variables

Let’s start with variable hoisting. Consider the following code:

console.log(myVar); // Output: undefined
var myVar = 10;
console.log(myVar); // Output: 10
Enter fullscreen mode Exit fullscreen mode

Despite the myVar variable being used before its declaration, no error occurs. Instead, undefined is logged to the console. This happens because the declaration of myVar is hoisted to the top of its scope, but its assignment remains in place. The code above is interpreted as:

var myVar;
console.log(myVar); // Output: undefined
myVar = 10;
console.log(myVar); // Output: 10
Enter fullscreen mode Exit fullscreen mode

Hoisting Functions

Function declarations are also hoisted. Consider this example:

greet(); // Output: Hello!

function greet() {
  console.log('Hello!');
}
Enter fullscreen mode Exit fullscreen mode

The greet function is called before its declaration, yet it works correctly. This is because the function declaration is hoisted to the top of its scope. The code is interpreted as:

function greet() {
  console.log('Hello!');
}

greet(); // Output: Hello!
Enter fullscreen mode Exit fullscreen mode

Let and Const Declarations

With the introduction of ES6, let and const keywords provide block-scoped variables, which are not hoisted in the same way as var. However, their declarations are still hoisted, but they remain in a "temporal dead zone" (TDZ) from the start of the block until the declaration is encountered. Accessing them before the declaration results in a ReferenceError.

console.log(myLetVar); // ReferenceError: Cannot access 'myLetVar' before initialization
let myLetVar = 20;

console.log(myConstVar); // ReferenceError: Cannot access 'myConstVar' before initialization
const myConstVar = 30;
Enter fullscreen mode Exit fullscreen mode

Practical Examples

Example 1: Variable Hoisting with var

function hoistExample() {
  console.log(message); // Output: undefined
  var message = 'Hoisting in JavaScript';
  console.log(message); // Output: Hoisting in JavaScript
}

hoistExample();
Enter fullscreen mode Exit fullscreen mode

Example 2: Function Hoisting

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

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

Example 3: Temporal Dead Zone with let and const

function tdzExample() {
  console.log(tempVar); // ReferenceError: Cannot access 'tempVar' before initialization
  let tempVar = 'Temporal Dead Zone';
}

tdzExample();
Enter fullscreen mode Exit fullscreen mode

Conclusion

Hoisting is a crucial concept to understand in JavaScript as it affects variable and function declarations. Remember:

  • Variable declarations (using var) and function declarations are hoisted to the top of their scope.
  • Variable initializations are not hoisted.
  • let and const declarations are hoisted but remain in a temporal dead zone until they are initialized.

By understanding hoisting, you can write more predictable and error-free code. Keep this concept in mind as you develop more complex JavaScript applications.

Top comments (0)