理解JavaScript函数范围

use*_*897 10 javascript scope

以下代码是JavaScript代码.我试图了解JavaScript中的函数范围并在此处阅读文章.我正在复制下面的代码 -

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
Run Code Online (Sandbox Code Playgroud)

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

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

bfa*_*tto 9

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

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

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


Ben*_*ick 5

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

所以

  1. 范围中的所有变量都被视为在范围的开头声明
  2. if语句不会创建新范围.

所以你的例子相当于

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
Run Code Online (Sandbox Code Playgroud)

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


SLa*_*aks 4

Javascript 没有块作用域(catch块中除外)。
所有var语句都被提升到包含函数的顶部。

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