2 回答
TA貢獻(xiàn)48條經(jīng)驗(yàn) 獲得超30個(gè)贊
問(wèn)題挺有意思的。
為什么第一個(gè)輸出的是function?a(){}?
?因?yàn)楹瘮?shù)聲明會(huì)提升到當(dāng)前作用域的頂部。
下面函數(shù)調(diào)用傳了參數(shù)fn(1)??這個(gè)參數(shù)沒(méi)有改變預(yù)解析時(shí)??a=function?a(){}嗎。還是在傳參的時(shí)候不會(huì)向下面var?a=2一樣的表達(dá)式改變??a的值
這句話沒(méi)太看懂,只下說(shuō)我的理解:不管你給不給函數(shù)fn1()傳遞參數(shù),最后輸出的結(jié)果都是一樣。
假設(shè)我們傳入?yún)?shù):1 ,這時(shí)1=參數(shù)a,參數(shù)a進(jìn)入函數(shù)后。
函數(shù)內(nèi)會(huì)首先做兩件事: 變量聲明提升和函數(shù)聲明提升,即把變量和函數(shù)的聲明提升到當(dāng)前作用域的頂部。(具體可自行百度)。
于是函數(shù)內(nèi)的代碼會(huì)變成這樣子:
function?fn1(a){
??var?a;?
??function?a(){};
????console.log(a);??
????a=2;?
????console.log(a);
}可見(jiàn),我們傳進(jìn)函數(shù)內(nèi)的參數(shù)a被函數(shù)內(nèi)部聲明的變量a先覆蓋掉了。
以上是個(gè)人拙見(jiàn),如有錯(cuò)誤,歡迎指正。
添加回答
舉報(bào)
