2011-12-16 57 views

回答

4

您的代碼具有誤導性,風格使人們認爲執行順序很重要。標準的JavaScript引擎這些天將採取和重新格式化之前運行它:

var a = 1, 
b = function() { 
    var a = function() {}; 
    a = 10; 
    return; 
}; 
b(); 
alert(a); 

現在你可以瞭解到底發生了什麼。在函數「b」中再次聲明「a」,所以實際上現在有兩個「a」變量。一個是「window.a」,另一個是「b var a」,但不是「b.a」,因爲它不能在閉包或函數之外訪問。

換句話說,你得到你的代碼。

請讓您的代碼易讀並且不要混淆這一觀點。

6

在函數中用最後一行聲明符號「a」。這是受轉讓聲明影響的「a」。

函數聲明語句被懸掛到函數的頂部並首先被解釋。因此,賦值語句在之後有效地發生,您已經聲明瞭一個名爲「a」的函數(局部於「b」函數)。因此,該作業影響符號,而不是全球「a」。

請記住,變量不是鍵入的,因此您將名稱綁定到函數的事實不會阻止它稍後被賦值爲數值。

+0

哇。這是javascript可愛的靈活性的一個很好的例子,如果你不小心如何編寫它,麻煩會讓你陷入困境。 – 2011-12-16 22:33:20

+1

是的!簡單明瞭的JavaScript使它變得複雜:-) – Pointy 2011-12-16 22:35:08