I came across JavaScript 'hoisting' and I didn't figure out how this snippet of code really functions:
var a = 1;
function b() {
    a = 10;
    return;
    function a() {}
}
b();
alert(a);
I know that function declaration like ( function a() {} ) is going to be hoisted to the top of the function b scope but it should not override the value of a (because function declarations override variable declarations but not variable initialization) so I expected that the value of the alert would be 10 instead of 1!!
a is set to 1
b() is calledfunction a() {} is hoisted and creates a local variable a that masks the global a
a is set to 10 (overwriting the function a)a (still 1) is alertedIt'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.
(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  
                        function a(){} is hoisted first, hence in local scope a is created. a=10, you are setting the local variable a , not the global one.Hence, the value of global variable remain same and you get, alerted 1
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