2013-05-28 53 views

回答

6

由於變量提升,訂單解釋如下所示。請注意,正如@ShadowCreeper正確指出的那樣,function a(){}實際上是在函數b的內部創建一個局部變量a,如下所示。

var a; 
var b; 

a = 6; 
b = function() { 
var a; 
a = function(){}; 
a = 10; 
console.log(a); //10 
} 
b(); 
console.log(a); //6 
+1

+1提起'提升' – sabithpocker

+0

在'b'裏面定義'a'作爲一個函數,強制'a'是局部於'b',即使沒有明確地執行'var a'。隱式本地範圍背後的魔力是什麼? – sabithpocker

+0

+1好例子 – John

2

因爲你正在創建一個局部變量(函數a),然後用10替換該局部變量的值(function)。

一種避免這種情況的方法是在所有局部變量和函數之前加上「_」(下劃線)。

+0

東西告訴我這是不夠正確的。我沒有downvote,fwiw ... – xandercoded

+2

如果你把'var a = 10;'放在'b'函數的頂部,你將會有一個隱藏全局的局部變量。我相信,函數a()與var a = function()相同(創建一個名爲'a'的局部變量,它是一個'function')。 –

+0

表示同意,這裏嵌套'函數a'的隱式局部聲明是kicker http://jsfiddle.net/AVcqr/ ... – xandercoded

2

This answer對這裏發生的事情有很好的解釋。

總結是Javascript分兩個階段進行處理,然後編譯然後執行。函數定義發生在編譯步驟中,因此編譯器在b內部看到定義function a() {},並且在b的範圍內創建了局部變量a。稍後執行代碼時,在執行任何代碼之前,b的範圍已經包含本地變量a,因此行a = 10;僅給本地變量一個新值。函數定義在編譯過程中已經被處理,所以在執行過程中不會發生,所以console.log(a)將輸出10

相關問題