我认为myColor
可以从sayColor()
本地上下文访问,但即使我在第一次警报后声明myColor也不行。为什么呢?
var myColor = "blue";
function sayColor() {
alert(myColor); //undefined expected blue
var myColor = "green";
alert(myColor); //green
}
sayColor();
答案 0 :(得分:12)
这里发生的事情被称为“吊装”。使用var
和函数语句的变量声明被“提升”到其包含范围的顶部。 (请注意,从ES6开始,let
和const
具有不同的语义。)因此,对于浏览器来说,您的代码实际上是这样的:
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变量也会被重置。