預編譯 - js函式高階
阿新 • • 發佈:2021-07-29
JS執行機制
-
語法分析
-
預編譯
-
解釋執行
預編譯
-
函式宣告整體提升
-
變數宣告變數名提升
預編譯前奏
- 如果變數未宣告就賦值,此變數為全域性物件所有
var a = b = 123 //在區域性作用域中宣告
此時b為全域性變數
- 一切宣告的全域性變數,全為window的屬性
預編譯開始
-
建立AO物件
-
找形參和變數宣告,將形參名和變數作為AO屬性名,值為undefined
-
將實參值和形參統一
-
在函式體裡面找函式宣告,值賦予函式體
function fn(a) { console.log(a) var a = 123 console.log(a) function a() {} console.log(a) var b = function() {} console.log(b) function d() {} } fn(1)
- 建立AO物件(Activation Object)[執行期上下文]
AO {}
- 處理AO物件,設定AO的key
AO {
a: undefined,
b: undefined
}
- 引數統一
AO {
a: 1,
b: undefined
}
- 函式宣告處理
AO {
a: function a() {},
b: undefined,
d: function d() {},
}
預編譯發生在函式執行前一刻
- 執行函式
- 處理賦值,將變數值賦值給相關的變數名
列印輸出: function a() {} 123 123 function () {}
Go (Global Object) 就是window,同時GO的預編譯和AO一樣