在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ 分享一道面試題,請(qǐng)指點(diǎn)結(jié)果為何是undefined

分享一道面試題,請(qǐng)指點(diǎn)結(jié)果為何是undefined

if(!("a" in window)){
    var a = 10;
}
console.log(a); // undefined

回答
編輯回答
懶豬

主要原因是以為有塊作用域看偏了吧,

2018年3月27日 22:57
編輯回答
鐧簞噯

使用var導(dǎo)致此處不存在作用域,var a = 10等同于在if語句外面設(shè)置,var設(shè)置變量有個(gè)變量提升,所以if判斷時(shí)a已經(jīng)被定義但是未賦值,導(dǎo)致if語句判斷結(jié)果為flase不能對(duì)a進(jìn)行賦值,下面的結(jié)果為undefined

2018年5月12日 13:16
編輯回答
凹凸曼

只要有var,不等到方法執(zhí)行,就會(huì)把變量提升的方法的開始之處,這里就相當(dāng)于提升到了window的作用域中。

2017年4月20日 05:49
編輯回答
我不懂

因?yàn)閕f 條件不成立,所以a 并沒有賦值。但是因?yàn)樽兞柯暶鞯淖饔糜蛱嵘?,所以var a的聲明提升到了頂部。
于是 a 就是聲明但未賦值的變量 ,為undefined

2017年5月10日 07:51
編輯回答
愿如初

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

2017年3月17日 18:28
編輯回答
兔寶寶

謝謝大家的回答,原來以為自己對(duì)變量提升的概念已經(jīng)很熟悉了,沒想到遇到問題還是看漏了眼。

2017年5月6日 11:30
編輯回答
離觴

額.剛剛被點(diǎn)了滅重新編輯一下答案.
我的意思是.
在if或者for作用域里面通過var的形式去定義的一個(gè)變量,

這個(gè)變量是等同于
在if或者for所在的作用域里面去定義.而且滿足變量提升的原則

2017年6月11日 03:31
編輯回答
蟲児飛

首先弄明白in運(yùn)算符,可以在MDN中查看。如果指定的屬性在指定的對(duì)象或其原型鏈中,則in 運(yùn)算符返回true。

然后就是js引擎執(zhí)行js語句機(jī)制了,js引擎運(yùn)行時(shí)會(huì)執(zhí)行三步操作,第一步是先檢查你的js代碼有沒有低級(jí)的語法錯(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è)變量,沒有賦值操作,所以此階段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; // 跳過不執(zhí)行  a的值還是undefined
}

console.log(a)  // undefined
2017年3月21日 11:01
編輯回答
下墜
因?yàn)樽兞刻嵘阶饔糜蝽敳?
//變量提升
var a ;

//此時(shí) a 為全局變量  a in window 為 true

if(!("a" in window)){
 var a = 10;
}
console.log(a); // undefined
2017年7月30日 14:04