程式碼如下:
if(!("a" in window)){ var a = 1; } alert(a);
我已經看過了相關解釋,原因是變數宣告會被提升,但是變數賦值並不會被提升,但還是不太明白。 if語句區塊裡面的程式碼到底有沒有被執行?如果沒有,變數的提升是哪一語句造成的?如果執行了,那麼a的值應該就是1啊。 嘗試了控制台輸入以下程式碼
alert(b)//报错,b未被定义;
if (2>1){ var b=1; } alert(b)//1
业精于勤,荒于嬉;行成于思,毁于随。
if("a" in window)var a = 1;alert(a);
沒有執行
變數提升不是語句造成的,實在js引擎編譯你的js程式碼時進行的!
以chrome為例,首v8引擎碰到你的程式碼,會把它變成這樣:
var a; if(!("a" in window)){ a = 1; } alert(a);
然後因為a已經宣告了 所以!("a" in window) 總是為假! if內語句不執行! 所以alert(a)時 a沒有值
我用你的程式碼結果彈出1
變數宣告提升後變成一下程式碼
var a; // 这里变量声明提升了 if(!("a" in window)){ a = 1; } alert(a);
變數宣告提升後,先定義了a,之後進入if語句,a是window的屬性,取反之後變成false,所以if語句裡面的程式碼沒有執行,最後彈出來的就是undefined
undefined
var a;if(!(a in window)){
var a = 1;
}alert(a);if不成立裡面的程式碼當然不會執行了 所以a是undefined沒毛病
在JavaScript引擎解析這段程式碼的時候,會解析成如下樣子:
var a ; if(!("a" in window)){ a = 1; } alert(a);
因為你的a已經聲明為window的屬性了,故if條件始終為假,a未被賦值即為undefined.
a
if("a" in window)
var a = 1;
alert(a);
問題1
沒有執行
問題2
變數提升不是語句造成的,實在js引擎編譯你的js程式碼時進行的!
啥原理?
以chrome為例,首v8引擎碰到你的程式碼,會把它變成這樣:
然後因為a已經宣告了 所以!("a" in window) 總是為假! if內語句不執行!
所以alert(a)時 a沒有值
我用你的程式碼結果彈出1
變數宣告提升後變成一下程式碼
變數宣告提升後,先定義了a,之後進入if語句,a是window的屬性,取反之後變成false,所以if語句裡面的程式碼沒有執行,最後彈出來的就是
undefined
var a;
if(!(a in window)){
}
alert(a);
if不成立裡面的程式碼當然不會執行了 所以a是undefined沒毛病
在JavaScript引擎解析這段程式碼的時候,會解析成如下樣子:
因為你的
a
已經聲明為window的屬性了,故if條件始終為假,a未被賦值即為undefined.