預編譯 - Js三部曲
阿新 • • 發佈:2020-10-18
預編譯前奏
imply global - 暗示全域性變數, window - 全域性域
任何變數未經宣告即賦值,該變數為全域性所有 window
一切宣告的 "全域性" 變數,歸window所有
eg: var a = 10 ==> window.a = 10
window { a : 10 };
預編譯 - 四部曲
預編譯發生在函式執行的前一刻
建立AO物件 - Activation Object (執行上下文)
AO {
}
尋找形參和變數宣告,將變數和形參名作為AO屬性名,值為undefined
AO {
a: undefined,
b: undefined
}
將實參值和形參統一
AO {
a: 1,
b: undefined
}
在函式體內找到函式宣告,值賦予函式體
AO {
a: function a() {},
b: undefined,
d: function d() {}
}
預編譯結束 --> 函式開始執行
AO {
a: function a() {},
b: undefined,
d: function d() {}
}
第一次列印的a為,function a() {}
AO {
a: 123,
b: undefined,
d: function d() {}
}
第二次列印的a為,123
AO {
a: 123,
b: undefined,
d: function d() {}
}
第三次列印的a為,123 ,a函式已預編譯過了
AO {
a: 123,
b: function () {},
d: function d() {}
}
列印的b為,function () {}, 即賦值
全域性預編譯與此相同,但其是生成GO物件,GO === window
注意: var a = b = 1; 此時的b為全域性變數,歸GO物件所有,AO物件裡不存在.