javascript
js中立即执行函数会预编译吗_JavaScript预编译过程
什么是預編譯?
當js代碼執行時有三個步驟:
1.語法分析,這個過程檢查出基本的語法錯誤。
2,預編譯,為對象分配空間。
3,解釋執行,解釋一行執行一行,一旦出錯立即停止執行。
預編譯發生在代碼執行的前一刻。
預編譯的具體過程:
預編的時候會生成AO (Activetion Object,執行期上下文)和GO (Global Object,等于window)
【注1】先生成GO,生成后會逐行執行代碼,遇到某個函數要執行時,在執行前的前一刻會預編譯這個函數,生成AO,
換言之,AO用于全局中的某個具體函數,而GO用于整個全局,詳情請看下面例子:
運行結果如下:
GO創建過程:
1.首先創建GO對象。
GO{}
2.在全局中尋找變量聲明作為GO的屬性,并將undefined賦給它。
GO{
b:undefined;
}
3.在全局中尋找函數聲明(【注2】注意不是變量賦值)作為GO屬性,并將函數體賦值于它。
GO{
b:function{...};(此時第二步中的b已被覆蓋成為function b);
}
然后開始逐行執行代碼,遇到第一個console.log(b);打印的是GO中的b;
AO創建過程:
第一次打印完b后,代碼執行到 然后開始創建AO,其創建過程和GO相似只是多了一步實參形參相統一而已。
1.創建AO對象。
AO{}
2.在相應函數中尋找形參和變量聲明作為執行期上下文的屬性,并將undefined賦給它們。
AO{
b:undefined;(這個b是變量b,此函數沒有形參)
}
3.實參形參相統一。
4.尋找函數聲明作為它的屬性,并將函數體賦給它。
AO{
b:function{...};(函數b將變量b覆蓋)
}
開始執行函數b,第二個console.log(b)結果為function(){},
執行AO中b的值被賦成10,執行第三個console.log(b)結果為10.
總結
以上是生活随笔為你收集整理的js中立即执行函数会预编译吗_JavaScript预编译过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++学习之路 | PTA乙级—— 10
- 下一篇: C++学习之路 | PTA乙级—— 10