(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)

