Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Understanding JavaScript function scoping

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 ?

like image 609
user1720897 Avatar asked Jun 12 '13 19:06

user1720897


2 Answers

Variable declarations inside functions are always hoisted to the top. So your code is actually:

var f = function (x) {
    var cow, r;
    r = 0;
    cow = "glue";
    if (x > 3) {
        cow = 1; // a local variable
        r = 7;
    }
    return r;
};

Inside the function you're always assigning to the local cow, never the global.

like image 111
bfavaretto Avatar answered Oct 07 '22 20:10

bfavaretto


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

  1. All variables in a scope are considered declared at the beginning of the scope
  2. an if statement does not create a new scope.

So your example is equivalent to

var cow = "purple"; // just a random cow

var f = function (x) {
    var cow, r = 0;
    cow = "glue";
    if (x > 3) {
        cow = 1; // a local variable
        r = 7;
    }
    return r;
};

var z = f(2);
alert(cow); // returns purple

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.

like image 25
Ben McCormick Avatar answered Oct 07 '22 20:10

Ben McCormick