2 回答

TA貢獻(xiàn)1038條經(jīng)驗(yàn) 獲得超227個(gè)贊
涉及到j(luò)s的變量提升和詞法分析,變量解析的優(yōu)先順序如下
js語言定義變量? 像this,arguments這類變量名
形參變量 形參變量會(huì)添加到函數(shù)的作用域中
函數(shù)聲明 表現(xiàn)出現(xiàn)的就是函數(shù)體
變量聲明?
詞法分析順序:參數(shù)-->變量聲明 --> 函數(shù)說明
js函數(shù)在運(yùn)行期會(huì)生成一個(gè)活動(dòng)對象,先進(jìn)行變量提升,再做詞法分析,換句話來說就是變量覆蓋
當(dāng)代碼運(yùn)行到第1個(gè)console.log時(shí)a已發(fā)生過賦值操作,因此詞法分析此時(shí)的參數(shù) a是活動(dòng)對象AO已存在a屬性且值為 1,與此同時(shí)受函數(shù)fn內(nèi)的 a也存在變量提升,它的默認(rèn)值 是undefined,對提升的普通變量在Ao上已存在,則不作任何操作, 但碰到后面的函數(shù)變量a也提升了,它的默認(rèn)值為該函數(shù)體,根據(jù)詞法分析順序,此時(shí)a輸出時(shí)變量會(huì)被同名的Ao屬性a覆蓋結(jié)果輸出函數(shù)體,到第2個(gè)console時(shí)進(jìn)入時(shí),因變量提升已分析完,直接進(jìn)入了詞法分析(進(jìn)入作域首先做的就是變量提升),之上明確聲明 a值 且賦值就是2,它在函數(shù)a變量提升之后,導(dǎo)致覆蓋直接輸出變量2.
需要注意的是在詞法分析階段,針對AO對象上的已存在的屬性變量,其在詞法分析變量階段不作任何操作。但若存在函數(shù)變量提升,則會(huì)被賦蓋。
另外一個(gè)要注意的是,js雖然大體上是從上到下的執(zhí)行,但在引擎解析這部分會(huì)有其它的小動(dòng)作,畢竟最終執(zhí)行者還是引擎,引擎想更改執(zhí)行順序太容易了。
添加回答
舉報(bào)