关于javascript:为什么我的全局变量在函数中不可访问?

Why my global variable is not accessible within a function?

本问题已经有最佳答案,请猛点这里访问。

我认为myColor可以从sayColor()本地上下文访问,但即使我在第一个警报后声明myColor也不行。 为什么?

1
2
3
4
5
6
7
var myColor ="blue";
function sayColor() {
    alert(myColor); //undefined expected blue
    var myColor ="green";
    alert(myColor); //green
}
sayColor();

这里发生的事情被称为"吊装"。使用var和函数语句的变量声明被"提升"到其包含范围的顶部。 (请注意,从ES6开始,letconst具有不同的语义。)因此,对于浏览器来说,您的代码实际上如下所示:

1
2
3
4
5
6
7
8
var myColor ="blue";
function sayColor() {
    var myColor;
    alert(myColor); //undefined expected blue
    myColor ="green";
    alert(myColor); //green
}
sayColor();

来自MDN:

Every definition of a variable is really a declaration of the variable at the top of its scope and an assignment at the place where the definition is.


您正在使用同名的局部变量隐藏全局变量myColor。从函数中删除var关键字以查看全局变量。

1
2
3
4
5
6
7
var myColor ="blue";
function sayColor() {
    alert(myColor);
    myColor ="green"; // Omit the"var" keyword.
    alert(myColor);
}
sayColor();

Javascript只有函数作用域,函数中声明的所有变量都被提升到顶部,因此它们在整个函数中都可用。 OP原始版本中的第一个警报是使用未初始化的,提升的局部变量,这就是它打印undefined的原因。


因为你再次宣布它。

1
 var myColor ="green";

在JavaScript中,在解释器执行函数之前,它会扫描整个函数以获取var ...语句。因此,即使在执行函数的第一个语句之前,myColor变量也会被重置。


您正在再次在函数内设置变量。浏览器在分配之前读取函数,这会导致未定义的结果。

这是正确的。

1
2
3
4
5
6
7
var myColor ="blue";
function sayColor() {
    alert(myColor); //undefined expected blue
    myColor ="green";
    alert(myColor); //green
}
sayColor();