易錯面試題

(1)

var?a?=10;

????function?test(){

????????a?=?100;

????????console.log(a)

????????console.log(this.a)

????????var?a;

????????console.log(a)

????}

????test()

//作用域? this? 變量提升

答案:100? 10? 100


(2)

????(function(){

????????var?a=b=3

????})()

????console.log(a)? //報錯

????console.log(b)? //3

解析: var a=b=3? ? 執(zhí)行是的是? b=3;? var a=b

在函數(shù)內(nèi)部沒有找到3相當(dāng)于在全局變量聲明了一個b=3,因此console.log(b)為3

而var a在函數(shù)內(nèi)部聲明了,作用域在函數(shù)內(nèi)部,因此在外面console.log(a)所以報錯.



(3)

?for(var?i?= 1;?i<=3;i++){

????????setTimeout(function(){

???????????console.log(i)?

????????},0)

????}

答案 :444

//? 事件循環(huán)? 等待隊列 異步

解析:js是單線程語言,for是同步,在主線程,setTimeout是異步,要放在等待隊列.主線程所有任務(wù)執(zhí)行完畢后,在把等待里面的任務(wù)放在主線程里面執(zhí)行.因此主線程for循環(huán)執(zhí)行完畢后,i已經(jīng)等于4,因此輸出三個4,var在全局作用域

如果把var改成了let,則輸出123.因為es5只有兩種作用域:全局作用域和函數(shù)作用域,es6新增了塊級作用域.for循環(huán)循環(huán)了3次,相當(dāng)于產(chǎn)生了3個塊級作用域,因此每一個i的值都是不一樣




(4)?

function?fun(n){

????????console.log(n)? //123

????????var?n?=?456

????????console.log(n)? //456

????}

????var?n?=123

????fun(n)

答案:123? 456

如果function?fun()? 則為und 和 456

作用域:先內(nèi)部找,如果找不到,再向外部找

優(yōu)先級:變量>普通函數(shù)>參數(shù)>提升



(5)

?function?fun(){

????????console.log(n)? //123

????????n?=?456? //前面沒有var? 沒有變量提升

????????console.log(n)? //456

????}

????var?n?=123

????fun()

答案:123? 456

解析:第一個n在函數(shù)里面找,沒找到,因此去外面找,所以是123,接著n=456,也在函數(shù)內(nèi)部找n,給n賦值,也沒找到,因此全局n賦值為456,因此下面的那個n也輸出為456


(6)

??function?fun(){

????????console.log(n)? //und

????????n?=?456

????????console.log(n)? //456

????}

????fun()

????var?n?=123

答案:und??456

(7)

????function?fun(){

????????console.log(fun)? //fn

????????fun?=?456

????????console.log(fun)? //456

????}

????fun()

????var?fun?=123

答案:fn? ?456

解析:因為預(yù)解析函數(shù)優(yōu)先級比var要高,因此fun = funcition fun,所以第一個答應(yīng)的是fn

如果var fun =123放在最上面,fun還是會俾fun =123 先執(zhí)行,因此最后fun(),會報錯,因為這時候fun = 123,不是一個函數(shù),調(diào)用不了


(8)

???var?iNum?=?0

????????for(var?i?=?0;i<10;i++){

????????????if(i%5==0){

????????????????continue

????????????}

????????????iNum++

????????}

????????console.log(iNum)

答案:8

解析:i=1,iNum=1,

i=2,iNum=2,

...

i=5,iNum=4

i=6,iNum=5

...

i=9的時候跳出循環(huán),所以INum=8


(9)

<script>

????var?a?=?1

</script>

<script>

????var?a

????var?b?=?a?/?0? //b==infinity

????if(b==b){

????????console.log(b*2+'2'+4)

????}else{

????????console.log(!b*2+'2'+4)

????}

</script>

答案:Infinity24

解析:因為a=1,1/0為正無窮大,即Infinity,Infinity==Infinity為true,

Infinity*2還是無窮大為Infinity,因此為Infinity24



(10)

答案:輸出btn,因為是btn按鈕執(zhí)行的,因此this指向btn



(11)


18行實際上是新創(chuàng)建了一塊新內(nèi)存,實際上兩塊內(nèi)存



(12)


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容