1. 程式人生 > 實用技巧 >預編譯 - Js三部曲

預編譯 - Js三部曲

預編譯前奏

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物件裡不存在.