Altcademy - a Forbes magazine logo Best Coding Bootcamp 2023

What is hoisting in JavaScript

Understanding Hoisting in JavaScript

JavaScript has a unique attribute that makes it different from some other programming languages. This attribute is called 'hoisting'. Let's dive into the concept of hoisting and understand how it works in JavaScript.

What is Hoisting?

Hoisting is JavaScript's default behavior of moving declarations to the top. To put it differently, it’s a process where variable and function declarations are put into memory during the compile phase, which means regardless of where these variables and functions are declared, they are moved to the top of their containing scope.

This might sound complex, but let's break it down with a simple analogy. Imagine that you're reading a mystery novel. The author sometimes introduces a character at the start, but reveals their important role later in the story. Similarly, in JavaScript, you might see variables or functions being used before they are declared. This is possible due to hoisting.

Variables and Hoisting

In JavaScript, we have three types of variable declarations: var, let and const. Each handles hoisting differently.

The var Keyword

When you declare a variable using var, JavaScript engine allocates memory for it and sets its value as undefined during the compile phase. Let's look at an example:

console.log(myVar); // undefined
var myVar = 5;
console.log(myVar); // 5

In the first line, you might expect a ReferenceError since myVar was logged before it was declared. But thanks to hoisting, JavaScript already knows about myVar and simply logs undefined.

The let and const Keywords

Unlike var, variables declared with let and const are also hoisted, but not initialized. This means that if you try to use them before declaration, JavaScript will throw a ReferenceError.

console.log(myLetVar); // ReferenceError
let myLetVar = 10;

Here, JavaScript knows about myLetVar but because it's not initialized, it throws an error.

Functions and Hoisting

Functions, like variables, are also hoisted in JavaScript. But there's a key difference: function declarations are hoisted and immediately initialized, unlike var variables.

console.log(myFunction()); // Hello, World!

function myFunction() {
  return 'Hello, World!';
}

Even though we called myFunction before it was declared, JavaScript didn't throw an error. This is because function declarations are hoisted and initialized.

However, it's important to note that function expressions, including those involving arrow functions, are not hoisted:

console.log(myFuncExpression()); // TypeError

var myFuncExpression = function() {
  return 'Hello, World!';
}

In this example, JavaScript throws a TypeError because myFuncExpression is a function expression and is treated like a var variable. So, while it's hoisted, it's not initialized.

Conclusion

Just like a detective figuring out the mysteries of a crime novel, you've unraveled the enigma of hoisting in JavaScript. You now understand how JavaScript hoists variables and functions differently. You've also learned how different keywords (var, let, const) interact with hoisting.

As a new programmer, you might be tempted to rely on hoisting. However, good coding practice suggests that you should always declare variables at the beginning of your scope. This makes code easier to read, understand, and debug. But knowing about hoisting can save you from potential pitfalls and unexpected behavior in your code.

Remember, JavaScript is like a stage play. Even though some characters (variables and functions) may not have appeared on stage yet, they are ready behind the scenes to play their part when the time is right. And that’s all thanks to the magic of hoisting!