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

时间:2013-07-05 17:26:19

标签: javascript

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

var myColor = "blue";
function sayColor() {
    alert(myColor); //undefined expected blue
    var myColor = "green";
    alert(myColor); //green
}
sayColor();

4 个答案:

答案 0 :(得分:12)

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

var myColor = "blue";
function sayColor() {
    var myColor;
    alert(myColor); //undefined expected blue
    myColor = "green";
    alert(myColor); //green
}
sayColor();

来自MDN

  

变量的每个定义实际上都是其范围顶部变量的声明,以及定义所在位置的赋值。

答案 1 :(得分:6)

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

var myColor = "blue";
function sayColor() {
    alert(myColor);
    myColor = "green"; // Omit the "var" keyword.
    alert(myColor);
}
sayColor();

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

答案 2 :(得分:1)

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

正确。

var myColor = "blue";
function sayColor() {
    alert(myColor); //undefined expected blue
    myColor = "green";
    alert(myColor); //green
}
sayColor();

答案 3 :(得分:1)

因为你再次宣布它。

 var myColor = "green";

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