What is the difference between below snippets?
var a = 0; function b(){ a = 10; return function a(){}; } b(); console.log(a); // => 10
and
var a = 0; function b(){ a = 10; return function a(){}; } b(); console.log(a); // => 0
It has something to do with JavaScript hoisting, but my understanding of the concept gives exactly the opposite output.
In JavaScript, Hoisting is the default behavior of moving all the declarations at the top of the scope before code execution. Basically, it gives us an advantage that no matter where functions and variables are declared, they are moved to the top of their scope regardless of whether their scope is global or local.
Hoisting is a JavaScript technique which moves variables and function declarations to the top of their scope before code execution begins. Within a scope no matter where functions or variables are declared, they're moved to the top of their scope.
Hoisting is JS's default behavior of defining all the declarations at the top of the scope before code execution. One of the benefits of hoisting is that it enables us to call functions before they appear in the code. JavaScript only hoists declarations, not initializations.
Variables defined with let and const are hoisted to the top of the block, but not initialized. Meaning: The block of code is aware of the variable, but it cannot be used until it has been declared. Using a let variable before it is declared will result in a ReferenceError .
return function a(){};
Here function ...
is an expression. A named function expression to be precise. The a
here doesn't matter much, it just gives the anonymous function a .name
, but it's still just a function expression that you're returning.
return function a(){};
This here is equivalent to:
return; function a(){};
Here function a
is a declaration, not an expression. It is hoisted, creating a local name a
in the scope, shadowing the outer a
. I.e. it is equivalent to:
function b(){ var a = function () {}; a = 10; return; }
return function a() {}
is same as
return; function a() {}
after automatic semicolon insertion. In second case, function a
is moved to the top of its scope. The code is same as
var a = 0; function b() { function a() {}; a = 10; return; } b(); console.log(a);
As a
inside b()
is inner function and then overriden, it is not accessible from outside of b()
.
Here is the demo to understand how the hoisting works.
var a = 0; function b() { console.log(a); // function a = 10; console.log(a); // 10 return function a() {}; } console.log(b()); // undefined console.log(a);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With