本篇文章開始說道js的作用域知識(shí),本篇主要講前奏的預(yù)編譯。
JS執(zhí)行三部曲
js的執(zhí)行分為三步:
1. 語法分析
2. 預(yù)編譯
3. 解釋執(zhí)行
語法分析:通篇分析程序是否有語法錯(cuò)誤;解釋執(zhí)行:即讀一句程序執(zhí)行一句;而預(yù)編譯作為一個(gè)很重要的環(huán)節(jié),主要發(fā)生在程序執(zhí)行之前的一刻,對(duì)于函數(shù),預(yù)編譯發(fā)生在函數(shù)執(zhí)行之前,所以對(duì)于預(yù)編譯來說,分成2部分:整個(gè)程序執(zhí)行前的預(yù)編譯和函數(shù)執(zhí)行前的預(yù)編譯,它們的過程是相同的,只是一個(gè)生成GO對(duì)象,一個(gè)生成AO對(duì)象。
預(yù)編譯四部曲
1. 創(chuàng)建AO(Activation Object 執(zhí)行期上下文)或GO(Global Object 全局執(zhí)行期上下文,也即window對(duì)象)對(duì)象
2. 找形參和變量聲明,將它們作為對(duì)象的屬性名,值賦值為undefined
3. 將實(shí)參和形參統(tǒng)一(實(shí)參的值賦值給形參)
4. 找函數(shù)聲明,將函數(shù)名作為對(duì)象屬性,值賦值為函數(shù)體
以上即為預(yù)編譯的四個(gè)步驟,下面做實(shí)例討論:
1. 創(chuàng)建AO
AO = { };
2. 找形參和變量聲明
AO = {
? ? a : undefined,
? ? c : undefined,
? ? b :undefined
};
3. 實(shí)參形參統(tǒng)一
AO = {
????a : 1,
????c : undefined,
????b :undefined
};
4. 找函數(shù)聲明
AO = {
????a : function a(){},
????c : undefined,
????b :undefined,
? ? d : function d(){}
};
預(yù)編譯完成后,執(zhí)行函數(shù),得到如下結(jié)果:
注意:
1. 條件語句對(duì)預(yù)編譯生成AO或GO對(duì)象沒有任何影響,里面的變量或函數(shù)聲明依然會(huì)加到對(duì)象中;
2. 預(yù)編譯是生成執(zhí)行期上下文,在函數(shù)執(zhí)行時(shí),會(huì)進(jìn)行上下文屬性的賦值工作。