爲什麼第二個函數輸出一個空數組?如何用變量範圍解釋這個問題?
var global = ["abc"];
function test1() {
var g = global || [];
console.log(g); //outputs: ["abc"]
}
function test2() {
var global = global || [];
console.log(global); //outputs: []
}
爲什麼第二個函數輸出一個空數組?如何用變量範圍解釋這個問題?
var global = ["abc"];
function test1() {
var g = global || [];
console.log(g); //outputs: ["abc"]
}
function test2() {
var global = global || [];
console.log(global); //outputs: []
}
雖然它看起來像它應該工作,因爲分配工作從右到左,你需要考慮變量聲明被吊起。
要解釋,你的代碼實際上是這樣的:
function test2() {
var global; // global is undefined
global = global || []; // because undefined is falsey, the [] is assigned
console.log(global); // displays the []
}
var global
重新定義符號global
是該功能的範圍內的局部變量,從而使其他global
不可見的。如果你想這樣做,第二個功能是什麼,使用不同的名稱:
var global = ["abc"];
function test2() {
var local = global || [];
console.log(local); //outputs: ["abc"]
}
,或者如果global
的原始定義是一個真正的全局變量,你可以使用窗口對象引用它,當它的規律符號是由一個局部變量隱藏的(雖然我不建議這樣做,因爲它可能會混淆人們試圖理解你的代碼):
var global = ["abc"];
function test2() {
var global = window.global || [];
console.log(global); //outputs: ["abc"]
}
它輸出一個空的名字是因爲一旦你有衝突的名字的原因。有一個本地和全球名爲global
。裏面定義的global
作爲本地所有出現的函數將參考本地。它永遠不會看到全球價值。
因此,行var global = global || []
將global
解釋爲本地。目前它是undefined
,因此它選擇[]
。使這項工作
的一種方法是使用合格的名稱爲全局實例
function test2() {
var global = window.global || [];
console.log(global); // outputs ["abc"]
}
你可能不應該刻意遮蔽這樣的變量開始。 – millimoose
請注意'var's被吊起來,所以它實際上是'var global; global = global || []' - 其中'global'因此是'未定義的'。 – pimvdb