2013-07-05 54 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變量在你的函數的第一個語句被執行之前被重置。

相關問題