1. 程式人生 > >"if (!(""a"" in window)) { var a = 1; } alert(a); 為什麼結果是undefined"

"if (!(""a"" in window)) { var a = 1; } alert(a); 為什麼結果是undefined"

首先,所有的全域性變數都是window的屬性,語句 var a = 1;等價於window.a = 1;

你可以用如下方式來檢測全域性變數是否宣告:"變數名稱" in window
第二,所有的變數宣告都在範圍作用域的頂部,看一下相似的例子:  

alert("b" in window);
var b;

此時,儘管宣告是在alert之後,alert彈出的依然是true,這是因為JavaScript引擎
首先會掃墓所有的變數宣告,然後將這些變數宣告移動到頂部,最終的程式碼效果是這樣的:

var a;
alert("a" in window);
這樣看起來就很容易解釋為什麼alert結果是true了。

第三,你需要理解該題目的意思是,變數宣告被提前了,
但變數賦值沒有,因為這行程式碼包括了變數宣告和變數賦值。

你可以將語句拆分為如下程式碼:

var a;    //宣告
a = 1;    //初始化賦值
當變數宣告和賦值在一起用的時候,JavaScript引擎會自動將它分為兩部以便將變數宣告提前,
不將賦值的步驟提前是因為他有可能影響    程式碼執行出不可預期的結果。

所以,知道了這些概念以後,重新回頭看一下題目的程式碼,其實就等價於:

var a;
if (!("a" in window)) {
    a = 1;
}
alert(a);
這樣,題目的意思就非常清楚了:首先宣告a,然後判斷a是否在存在,如果不存在就賦值為1,
很明顯a永遠在window裡存在,這個賦值語    句永遠不會執行,所以結果是undefined。

提前這個詞語顯得有點迷惑了,你可以理解為:預編譯。