2013-04-02 44 views
5
x = 1; 
alert(x); 
var y = function() { 
    alert(x); 
    var x = 2; 
    alert(x); 
} 
y(); 

3個警報的結果是:1undefined2器(Chrome 25)爲什麼我的全局變量在本地聲明之前被映射?

我的問題是:爲什麼第二次警報是不確定的?爲什麼不是1?是不是有一個全局變量x?

+0

因爲你在函數中映射'x'。所以有一個函數範圍變量'x',它還沒有被賦值,所以你沒有定義。這就是爲什麼總是建議在函數開始時聲明變量的原因,因爲無論如何它都會爲你完成。儘量不要迷惑自己。 – Chad

回答

12

由於hoisting,這是得到執行:

x = 1; 
alert(x); 
var y = function() { 
    var x; // <-- this gets hoisted up from where it was. 

    alert(x); 
    x = 2; 
    alert(x); 
} 
y(); 

在功能y()開始,局部變量x聲明但尚未初始化。

+0

但如果「x」是「提升」,是不是有衝突?因爲已經有一個「x = 1」?哪個聲明是第一個? 「吊裝X」或「X = 1」? –

+0

JavaScript沒有「衝突」它「陰影」。局部變量「陰影」具有相同名稱的任何變量是更高的範圍。因此,稍後當您使用'x'時,它將使用本地範圍。首先定義全局,然後在'y'的範圍內使用本地。 – Chad

+0

作用域的工作方式是,javascript首先在本地作用域中查找變量x。如果它發現它,它會停止查找,所以我們永遠不會到達全局x。如果它沒有找到它,它將向上移動到聲明函數時的範圍,然後用相同的模式在那裏搜索。 (在這種情況下,它會找到該聲明,因爲它已達到全局範圍)。所以,基本上,它就像洋蔥一樣,從裏到外。 –

1

函數中的變量聲明被懸掛在頂部。所以它在技術上看起來是這樣的:

var y = function() { 
    var x; 

    alert(x); 

    x = 2; 
}; 

局部變量忽略了全局變量。這就是爲什麼警報返回undefined

0

由於JavaScript中的作用域是一個函數對象。當你在一個函數中執行一些代碼(你的代碼示例)時,「alert(x)」會查找函數中是否存在「x」的任何定義。所以,這個函數中有一個「var x = 2」。但是JavaScript運行時會這樣解釋你的代碼:

x = 1; 
alert(x); 
var y = function() { 
    var x; 
    alert(x); 
    x = 2; 
    alert(x); 
} 
y(); 

所以,第二個警報中的x是「undefined」而不是「1」。所以當你在函數中聲明一些變量時,我建議你在函數的頂部聲明變量。

相關問題