3 回答

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超6個(gè)贊
首先弄明白in運(yùn)算符,可以在MDN中查看。如果指定的屬性在指定的對(duì)象或其原型鏈中,則in 運(yùn)算符返回true。
然后就是js引擎執(zhí)行js語(yǔ)句機(jī)制了,js引擎運(yùn)行時(shí)會(huì)執(zhí)行三步操作,第一步是先檢查你的js代碼有沒(méi)有低級(jí)的語(yǔ)法錯(cuò)誤,第二步是預(yù)編譯,第三步是根據(jù)代碼順序解釋一句執(zhí)行一句。
預(yù)編譯就是在執(zhí)行代碼會(huì)把所有的變量聲明和函數(shù)聲明預(yù)先處理。當(dāng)你寫了一句var a = 1時(shí),javascript會(huì)當(dāng)成兩個(gè)操作(變量聲明和變量賦值):var a;和a = 1;第一句(變量聲明)是在預(yù)編譯中執(zhí)行的,此時(shí)只是聲明了a這個(gè)變量,沒(méi)有賦值操作,所以此階段a的值為undefined。等預(yù)編譯結(jié)束,才開始上面的第三步解釋執(zhí)行js代碼。
所以根據(jù)執(zhí)行先后上面的代碼可以分解為下面的代碼:
// 先進(jìn)行預(yù)編譯
var a; // 此時(shí)a的值為undefined
// 預(yù)編譯結(jié)束 開始解釋執(zhí)行代碼
if(!("a" in window)){ // 變量a此時(shí)已經(jīng)存在,所以!("a" in window)為false
a = 10; // 跳過(guò)不執(zhí)行 a的值還是undefined
}
console.log(a) // undefined

TA貢獻(xiàn)2051條經(jīng)驗(yàn) 獲得超10個(gè)贊
由于變量提升,var a會(huì)在一開始的時(shí)候就出現(xiàn),此時(shí)值為undefined,然后執(zhí)行到if時(shí),由于a已經(jīng)在window中定義了,即開辟了一塊內(nèi)存,所以判斷結(jié)果為真,然后!真就變?yōu)榧?,所以跳過(guò)了賦值語(yǔ)句,最后console的是未賦值的a,結(jié)果為undefined

TA貢獻(xiàn)2037條經(jīng)驗(yàn) 獲得超6個(gè)贊
因?yàn)樽兞刻嵘阶饔糜蝽敳?/p>
//變量提升
var a ;
//此時(shí) a 為全局變量 a in window 為 true
if(!("a" in window)){
var a = 10;
}
console.log(a); // undefined
添加回答
舉報(bào)