Hoisting is a javascript concept and is defined as the process of moving variable and function declarations to the top of the file(or current scope of execution). Hoisting is done automatically by the javascript engine.
This post will explain hoisting in much more detail than the above definition. That was just for an interview purpose 😉
Hoisting can be divided into two parts: Function and Variable hoisting.
Understanding FunctionÂ
Before digging into the concept of function hoisting, first let us be familiar with terms like functions, function declaration and function expression in javascript. If you are familiar with these, skip this section.
To know more about javascript functions, refer this article.
Function: A function in javascript is a set of statements performing some task. A function may or may not accept arguments and may or may not return a value.
Function declaration: Defining a function using function keyword and a function name followed by function arguments and body is called function declaration in javascript.
When it is without any name, function is called an anonymous function.
Example,
function print() { console.log('Function declaration'); }
Function expression: A function declaration when assigned to a variable is known as function expression. A function expression may or may not contain a function name. Example,
// function expression with name const f = function print() { console.log('Function declaration'); } // function expression without name const f = function() { console.log('Function declaration'); }
1. Function Hoisting
Suppose you have a function defined in a javascript code as below.
function print() { console.log('Function declaration'); }
If you try to call this function before it is declared, then it will be successfully called. Example,
//call function print(); // prints Function declaration // define function function print() { console.log('Function declaration'); }
This is possible because at run time, the javascript engine moves all the function definitions at the top. Thus, at run time, the above code will become.
function print() { console.log('Function declaration'); } print();
This is called Function hoisting.
For functions that are defined using Function expression syntax, this does not happen.
That is, you can not call a function defined using Function expression syntax before its definition.
Thus, below code when executed will result in an error.
// call function f(); // function expression const f = function print() { console.log('Function declaration'); }
Uncaught ReferenceError: f is not defined
2. Variable Hoisting
In javascript, variable declarations are also hoisted. This means that if a variable is used before it is defined, then it will not be an error. Example,
// print variable value console.log(name); // prints undefined // declare variable var name;
This is because at run time, javascript engine will move all the variable declarations to the top. Thus, at run time, the above code will be changed to.
var name; console.log(name);
Value of variable will be undefined
since it has not been initialized till the time it is used.
// print variable value console.log(name); // declare variable var name = 'codippa';
Can you guess what does above code print?
It will again be undefined
 although the variable has been initialized. This is because javascript hoists declarations of variables, not their initialization. Above code at run time will be changed to.
var name; console.log(name); name = 'codippa';
Variable declaration will move to the top due to hoisting but its initialization will remain at the same line. Clearly, at the time the variable is used, it has no value or it is undefined
.
let
and const
are the new keywords for declaring variables and constants respectively, in javascript introduced in ES6. Variables and constants declared using these keywords are not hoisted.
That is, if you use variables that are declared with let
or constants declared with const
, then it will be an error. Example,
// print variable value console.log(name); // declare variable let name = 'codippa';
Above code will result in
Uncaught ReferenceError: name is not defined
Thus, variables declared with var
are hoisted but those declared with let
are not hoisted.
To know more about comparison between var
and let
keywords, refer this.
Hope this post clarified the concept of hoisting in javascript. Hit the clap!!!