1 全局
1.1 預(yù)處理:創(chuàng)建一個(gè)詞法環(huán)境(LexicalEnvironment,LE)台妆,掃描JS中的用聲明的方式聲明的函數(shù)绽榛,用var定義的變量并將它們加到預(yù)處理階段的詞法環(huán)境中去
全局預(yù)處理中這個(gè)LexicalEnvironment==window對(duì)象
注意:預(yù)處理的函數(shù)必須是JS中用聲明的方式聲明的函數(shù)(不是函數(shù)表達(dá)式)eg: function d(){...} 而不是var e=function(){...} 這是一個(gè)函數(shù)表達(dá)式 瞭郑;但是這個(gè)方式會(huì)把e當(dāng)作一個(gè)變量放入LE中氮趋。
也就是 全局預(yù)處理中的對(duì)象的聲明可以寫在使用的后面伍派。
命名沖突處理:
(1)處理函數(shù)聲明有沖突時(shí),會(huì)覆蓋剩胁;
(2)處理變量聲明有沖突時(shí)诉植,會(huì)忽略;
(3)在既有函數(shù)聲明又有變量聲明的時(shí)候昵观,最終結(jié)果往往是指向函數(shù)聲明的引用晾腔。
1.2 代碼的執(zhí)行階段:
(1)代碼會(huì)從上往下執(zhí)行
(2)遇到存在于詞法環(huán)境中的變量時(shí)進(jìn)行賦值 eg:下例子中的g變?yōu)閒unction
(3)遇到不存在詞法環(huán)境中的變量時(shí),js將一次性執(zhí)行聲明啊犬,即讓變量成為詞法作用域的成員并進(jìn)行賦值操作灼擂。一步到位;eg:下例子中會(huì)把b:5加入LE
2 函數(shù)
2.1 預(yù)處理
函數(shù)每調(diào)用一次觉至,都會(huì)產(chǎn)生一個(gè)詞法環(huán)境對(duì)象LE剔应,全局預(yù)處理中這個(gè)環(huán)境對(duì)象指的就是window對(duì)象,在函數(shù)預(yù)處理中康谆,該對(duì)象不可見领斥,無(wú)法訪問,是解析器的東西沃暗。
函數(shù)的LE多了一個(gè)參數(shù)arguments 記錄調(diào)用函數(shù)時(shí),實(shí)際傳入的參數(shù)個(gè)數(shù)何恶。
?全局作用域和函數(shù)作用域內(nèi)變量孽锥、函數(shù)分別進(jìn)行提升。
沖突處理:
(1)傳入?yún)?shù)與內(nèi)部函數(shù)名沖突時(shí)细层,函數(shù)是一等功名惜辑;
(2)而傳入?yún)?shù)和內(nèi)部自定義參數(shù)沖突時(shí),使用的仍是調(diào)用時(shí)傳入的參數(shù)值疫赎。
2.2 執(zhí)行階段
(1)給預(yù)處理階段的成員賦值
(2)如果沒有用var聲明的變量盛撑,會(huì)成為最外部LE,即window的成員