理解JavaScript函数范围

时间:2013-06-12 19:05:43

标签: javascript scope

以下代码是JavaScript代码。我试图理解JavaScript中的函数范围并遵循here上的文章。我正在复制下面的代码 -

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

我不太明白为什么字符串"紫色"警报。行cow = "glue";应该将cow变量的值设置为" glue"。如果我删除if块,然后在最后一个语句中警告cow,我看到字符串" glue"警报。

当调用f(2)时,不输入if代码块并且其中没有任何内容被执行,那么为什么我会看到不同的结果呢?那么为什么在最后一个语句中警告牛会返回字符串" purple"现在?

4 个答案:

答案 0 :(得分:9)

函数内的变量声明始终被提升到顶部。所以你的代码实际上是:

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

在函数内部,您总是分配给本地 cow,而不是全局。

答案 1 :(得分:5)

这里要理解的两件事是,Javascript变量被提升到其范围的顶部,而javascript没有块范围。

所以

  1. 范围内的所有变量都被视为在范围的开头声明
  2. if语句不会创建新范围。
  3. 所以你的例子相当于

    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
    

    if语句中的var声明被提升到顶部。此时,函数中的所有奶牛参考都是指局部变量牛,而不是来自外部范围的奶牛。

答案 2 :(得分:4)

Javascript没有块范围(catch块除外) 所有var语句都提升到包含函数的顶部。

因此,cow引用函数中任何位置的局部变量,即使if永远不会执行。

答案 3 :(得分:4)

你真的没看过那篇文章,是吗?它明确说明了

  

致电cow时,"glue"会变成f(2)吗?不,cow在上面的代码中是安全的,因为 if块中的var cow声明适用于整个函数。这意味着cow是整个函数的局部变量。

但是,删除if块时,还会删除其中的变量声明,并且赋值将以全局变量为目标。