預(yù)解釋,又叫做變量提升,是指在javascript運(yùn)行前,對(duì)變量進(jìn)行提前聲明,要注意的點(diǎn)是帶var關(guān)鍵字和function關(guān)鍵字的預(yù)解釋機(jī)制不同.
var關(guān)鍵字聲明的變量只聲明但是不賦值,function關(guān)鍵字聲明的變量既聲明又賦值.
上面所說(shuō)的也導(dǎo)致了在js的函數(shù)執(zhí)行過(guò)程中,var關(guān)鍵字后面的變量會(huì)被重新賦值,而function聲明的變量則不會(huì)被重新賦值.
我們來(lái)看一個(gè)例子:
函數(shù)在執(zhí)行前,對(duì)帶有關(guān)鍵字var和關(guān)鍵字function的變量進(jìn)行預(yù)解釋,var關(guān)鍵字聲明的變量只聲明不賦值,function關(guān)鍵字申明的變量既聲明又賦值,預(yù)解釋之后,a是function a(){console.log(2)};
之后函數(shù)按照從上到下的順序執(zhí)行,第一行相當(dāng)于a(){console.log(2),所以輸出2.接著執(zhí)行到第二行,a被重新賦值了一個(gè)新的函數(shù),再執(zhí)行到第五行,因?yàn)槭莊unction關(guān)鍵字在預(yù)解釋時(shí)就已經(jīng)聲明且賦值過(guò),這里直接跳過(guò),不會(huì)再重新賦值,再執(zhí)行到第六行,a輸出1;
這就是var跟function變量提升之間的區(qū)別,我們?cè)賮?lái)看兩個(gè)例子:
思考一下,這里會(huì)輸出什么?
答案是報(bào)錯(cuò)因?yàn)関ar關(guān)鍵字在預(yù)解釋時(shí)只聲明不賦值,所以此處a執(zhí)行輸出的是會(huì)顯示not a function
此處會(huì)輸出2.因?yàn)閒unction關(guān)鍵字在預(yù)解釋階段既聲明又賦值,所以執(zhí)行時(shí)會(huì)輸出的是2.
over.