Hoisting is a concept in JavaScript where the language moves all function and variable declarations to the top of their scope before executing the code. This means that regardless of where functions or variables are declared in the code, they can be used before they have been declared.
However, it’s important to note that hoisting behaves differently for function declarations and function expressions.
For function declarations, you can call a function before it’s defined without any issues. For example:
bark();
function bark() {
alert('wof!');
}
In this case, the bark()
function can be invoked before it is declared, thanks to hoisting.
On the other hand, hoisting does not work the same way for function expressions. Let’s consider the following example:
bark();
var bark = function() {
alert('wof!');
}
In this case, the var
declaration for bark
is hoisted and initialized with the value undefined
. Therefore, trying to invoke bark()
before it is assigned a function will result in a TypeError: bark is not a function
error.
It’s worth noting that while const
and let
declarations are hoisted as well, they are not initialized to undefined
like var
. Instead, they are initialized during the actual execution phase. If you try to invoke them before they are initialized, you’ll receive a ReferenceError: Cannot access 'bark' before initialization
error.
The same behavior applies to any other expression that assigns an object or class to a variable. In the case of class declarations, they are hoisted but not initialized, so using a class before its declaration will result in a ReferenceError: <Class> is not defined
error.
In conclusion, it’s best practice to always define functions, variables, objects, and classes before using them in your JavaScript code to avoid any unexpected hoisting-related issues.
Tags: hoisting, JavaScript, function declarations, function expressions, var, const, let, class declarations.