當構造函數a被調用時,'a'的值似乎失去了全局範圍。JavaScript範圍得到改變?爲什麼會發生?
var a = 6;
function b() {
a = 10;
function a() {}
console.log(a); //10
}
b();
console.log(a); //6
當構造函數a被調用時,'a'的值似乎失去了全局範圍。JavaScript範圍得到改變?爲什麼會發生?
var a = 6;
function b() {
a = 10;
function a() {}
console.log(a); //10
}
b();
console.log(a); //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
因爲你正在創建一個局部變量(函數a
),然後用10
替換該局部變量的值(function
)。
一種避免這種情況的方法是在所有局部變量和函數之前加上「_」(下劃線)。
東西告訴我這是不夠正確的。我沒有downvote,fwiw ... – xandercoded
如果你把'var a = 10;'放在'b'函數的頂部,你將會有一個隱藏全局的局部變量。我相信,函數a()與var a = function()相同(創建一個名爲'a'的局部變量,它是一個'function')。 –
表示同意,這裏嵌套'函數a'的隱式局部聲明是kicker http://jsfiddle.net/AVcqr/ ... – xandercoded
This answer對這裏發生的事情有很好的解釋。
總結是Javascript分兩個階段進行處理,然後編譯然後執行。函數定義發生在編譯步驟中,因此編譯器在b
內部看到定義function a() {}
,並且在b
的範圍內創建了局部變量a
。稍後執行代碼時,在執行任何代碼之前,b
的範圍已經包含本地變量a
,因此行a = 10;
僅給本地變量一個新值。函數定義在編譯過程中已經被處理,所以在執行過程中不會發生,所以console.log(a)
將輸出10
。
+1提起'提升' – sabithpocker
在'b'裏面定義'a'作爲一個函數,強制'a'是局部於'b',即使沒有明確地執行'var a'。隱式本地範圍背後的魔力是什麼? – sabithpocker
+1好例子 – John