JavaScript 'hoisting' [duplicate]
Solution 1:
- The global
a
is set to1
-
b()
is called -
function a() {}
is hoisted and creates a local variablea
that masks the globala
- The local
a
is set to10
(overwriting the functiona
) - The global
a
(still1
) is alerted
Solution 2:
It's because the order of compilation/interpretation in this example is somewhat misleading. The function a () {}
line is interpreted before any of the rest of the function is executed, so at the very beginning of the function, a
has the value of function a () {}
. When you reassign it to 10
, you are reassigning the value of a
in the local scope of function b()
, which is then discarded once you return, leaving the original value of a = 1
in the global scope.
You can verify this by placing alert()
s or the like in the appropriate places to see what the value of a
is at various points.
Solution 3:
(1) JavaScript does not have block statement scope; rather, it will be local to the code that the block resides within.
(2) Javascript's declaration of variables in a function scope, meaning that variables declared in a function are available anywhere in that function, even before they are assigned a value.
(3) Within the body of a function, a local variable takes precedence over a global variable with the same name. If you declare a local variable or function parameter with the same name as a global variable, you effectively hide the global variable.
you code is same as: (read comment)
<script>
var a = 1; //global a = 1
function b() {
a = 10;
var a = 20; //local a = 20
}
b();
alert(a); //global a = 1
</script>
reference:
(1) JavaScript Variable Scope:
(2) A Dangerous Example of Javascript Hoisting
(3) Variable scope
So in your code:
var a = 1; //global a = 1
function b() {
a = 10;
return;
function a() {} //local
}
b();
alert(a); //global a = 1