The code below is JavaScript code. I am trying to understand function scope in JavaScript and following the article over here. I am reproducing the code below -
var cow = "purple"; // just a random cow
var f = function (x) {
var r = 0;
cow = "glue";
if (x > 3) {
var cow = 1; // a local variable
r = 7;
}
return r;
};
var z = f(2);
alert(cow); // returns purple
I don't quite understand why the string "purple" is alerted. The line cow = "glue";
should set the value of the cow variable to "glue". If I remove the if block, and then alert cow in the last statement, I see that the string "glue" is alerted.
When f(2) is called, the if code block is not entered and nothing in it gets executed, so why do I see different results ? i.e why does alerting cow in the last statement return the string "purple" now ?
Javascript does not have block scope (except in
catch
blocks).All
var
statements are hoisted to the top of the containing function.Therefore,
cow
refers to the local variable anywhere in the function, even if theif
never executes.The two things to understand here are that Javascript variables are hoisted to the top of their scope, and javascript does not have block scope.
So
So your example is equivalent to
The var declaration in the if statement is hoisted to the top. At that point all cow references within the function refer to the local variable cow, rather than the cow from the outer scope.
Variable declarations inside functions are always hoisted to the top. So your code is actually:
Inside the function you're always assigning to the local
cow
, never the global.You didn't really read that article, did you? It explicitly states
However, when you remove the if block you also remove the variable declaration inside it, and the assignment will target the global variable.