JavaScript Hoisting

In JavaScript, hoisting is a behavior in which a function or a variable can be used before declaration.

Here is a simple example of variable hoisting in JavaScript. Read the rest of the tutorial to learn more.

Example

// use test variable before declaring console.log(test);
// declare and initialize test variable var test = 5; // Output: undefined

The above program works but the output is undefined since the variable hasn't been initialized at the time it's printed.


Hoisting in JavaScript

There are generally two types of hoistings in JavaScript:

  • Variable Hoisting
  • Function Hoisting

Let's understand each of them in detail.


Variable Hoisting

In JavaScript, the behavior of hoisting varies depending on whether a variable is declared using var, let, or const.

Hoisting With var

When we declare a variable using var, it is hoisted to the top of its current scope. For example,

// use the message variable before declaration
console.log(message);

// variable declaration using var keyword
var message;

// Output: undefined

In the above example, we can use the message variable before it is declared. This is because the variable is hoisted with the default value of undefined.

Thus, the above program is equivalent to:

var message;
console.log(message);

// Output: undefined

Hoisting With 'let' and 'const'

When we declare a variable using let or const, it is hoisted to the top of its current scope. However, the variable does not have a default value when it is hoisted (unlike when declared using var).

Let's take a look at the example below.

// use the message variable before declaration
console.log(message);

// variable declaration using let keyword
let message;

Output

ReferenceError: Cannot access 'message' before initialization

Here, the error occurs because a variable declared with let is not assigned any default value when hoisted.

Note: We know the message variable was hoisted because the error message "Cannot access 'message' before initialization" indicates that JavaScript is aware that message exists.

Had the variable not been hoisted, we'd get a different error, i.e., ReferenceError: message is not defined.


Function Hoisting

In JavaScript, function hoisting allows us to call the function before we have written it down in our code.

// function call greeting();
// function declaration function greeting() { console.log("Welcome to Programiz."); }

Output

Welcome to Programiz.

In the above example, we can call greeting() before it is declared because of hoisting.

Variable hoisting inside a function.

In JavaScript, a variable is hoisted only to the top of its current scope. Let's look at how this works inside functions:

function greet() {
    message = "hello";
    // use the variable b before declaration
    console.log(message); 
    var b;
}

greet();

// attempt to access message outside the function
console.log(message);

Output

hello
ReferenceError: b is not defined

In the above example, the message variable is hoisted to the top of the greet() function and becomes a local variable.

But when we try to access message outside the function, we get an error because the variable is hoisted only to the top of the function and not to the global scope.

Note: To learn more about local and global variables, visit JavaScript Variable Scope.

Function Expressions are not hoisted.

When we use a function expression, we cannot call it before its declaration. For example,

// function call
greet();

// function expression
var greet = function() {
    console.log("Programiz");
}

Output

TypeError: greet is not a function

Initializations Are Not Hoisted

JavaScript moves the declaration of variables to the top of its scope before the code runs.

However, the initialization part stays in the original place in the code. For example,

// program to display value
console.log(number);
var number = 5;

// Output: undefined

The above program is equivalent to:

var number;
console.log(number);
number = 5;

As you can see, only the declaration is moved to the top.

Hence, the value of the number variable is undefined because it is printed without initializing it.

Notes:

  • Generally, hoisting is not performed in other programming languages like Python, C, C++, and Java.
  • Hoisting can cause undesirable outcomes in your program. So, it's best to avoid this practice.

Also Read:

Did you find this article helpful?