2011-10-17 37 views
2

爲什麼第二個函數輸出一個空數組?如何用變量範圍解釋這個問題?

var global = ["abc"]; 

function test1() { 
    var g = global || []; 
    console.log(g);    //outputs: ["abc"] 
} 

function test2() { 
    var global = global || []; 
    console.log(global);  //outputs: [] 
} 
+2

你可能不應該刻意遮蔽這樣的變量開始。 – millimoose

+2

請注意'var's被吊起來,所以它實際上是'var global; global = global || []' - 其中'global'因此是'未定義的'。 – pimvdb

回答

5

雖然它看起來像它應該工作,因爲分配工作從右到左,你需要考慮變量聲明被吊起

要解釋,你的代碼實際上是這樣的:

function test2() { 
    var global; // global is undefined 

    global = global || []; // because undefined is falsey, the [] is assigned 

    console.log(global); // displays the [] 
} 
1

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"] 
} 
0

它輸出一個空的名字是因爲一旦你有衝突的名字的原因。有一個本地和全球名爲global。裏面定義的global作爲本地所有出現的函數將參考本地。它永遠不會看到全球價值。

因此,行var global = global || []global解釋爲本地。目前它是undefined,因此它選擇[]。使這項工作

的一種方法是使用合格的名稱爲全局實例

function test2() { 
    var global = window.global || []; 
    console.log(global); // outputs ["abc"] 
}