今天看到一個(gè)js的問題,想了好久之后不得其解各聘,到晚上才發(fā)現(xiàn)了問題所在寓娩,題目是這樣的:
if(!("a" in window)){
var a=1;
}
alert(a);
想必大家應(yīng)該看到過這個(gè)題目,他的正確答案是<code>1</code>.
我的思考過程如下:
首先在js里邊有個(gè)hoist機(jī)制堕仔,也就是變量和函數(shù)聲明提升機(jī)制擂橘。根據(jù)我之前的理解。
第一步摩骨,if語句沒起到隔離作用域的作用通贞,變量a還是聲明在全局的。所以接下來就要看判斷條件
<code>!("a" in window)</code>是否成立了恼五,他決定著變量a是否被被賦值昌罩。
第二步,接下來我們看<code>!("a" in window)</code>是否成立灾馒,注意======茎用,我也就是在這里犯迷糊了,此處開始是錯(cuò)誤的=========
我開始的時(shí)候想的是"a" 是一個(gè)字符串睬罗,如果他之前在被聲明為全局變量了轨功,那他應(yīng)該存在于window對(duì)象里的,
從事實(shí)上推斷容达,<code>"a" in window</code>應(yīng)該是<code>true</code>古涧,那么這樣賦值語句才會(huì)沒有起作用,從而彈出來的是 1.但是為什么<code>"a" in window</code>是true呢?字符串“a" 在之前從未出現(xiàn)過花盐,所以就開始瞎想了羡滑,可能是條件語句里的類型轉(zhuǎn)換圆米,也查到了很重要的資料JavaScript真值表,不過對(duì)于此題還是一無所獲
啄栓。==========
后來才想起來"a" in window 指的應(yīng)該是判斷window對(duì)象里邊是否有a這個(gè)屬性娄帖,就像for-in-obj 還有obj[name]一樣,問題就這樣解決了昙楚。應(yīng)為a被聲明為全局變量的近速,相當(dāng)于window.a。