2013-07-05 58 views

回答

12

这里发生了什么叫做“提升”。使用var和函数语句的变量声明被“悬挂”到其包含范围的顶部。 (需要注意的是,从ES6上,letconst有不同的语义)所以,浏览器的头脑,你的代码实际上是这样的:

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

MDN

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

6

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

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

的Javascript只有功能范围,所以他们在整个功能可在函数内声明的所有变量都提升到顶部。 OP原始版本中的第一个警告是使用未初始化的,悬挂的本地变量,这就是为什么它打印undefined

+0

是的,但不应该在第一次警报中可用,因为它尚未声明? –

+0

@AlfredoOsorio不,这不是JavaScript的功能。变量在声明它们的整个函数中都是可见的。 –

+1

变量声明*被悬挂*到函数的顶部。它是有效的:'function sayColor(){var myColor;警报(myColor); myColor =“绿色”;警报(myColor); }' – 1983

1

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

它是正确的。

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

因为您再次声明它。

var myColor = "green"; 

在JavaScript中之前由解释程序执行的功能,它扫描var ...语句整个功能。所以这就是为什么你的myColor变量在你的函数的第一个语句被执行之前被重置。

相关问题