######預編譯前奏
1.imply global 暗示全局變量:即任何變量未經聲明就賦值诚镰,則此變量就為全局對象(window)所有炼杖。
eg: ```? a=3; ```
eg:? ``` var a=b=123; ```
eg: ``` var a = 1;
? b = 2;
? function test() {
? ? ? var c = d = 9;
? }
? test();
? consolo.log(c); //error
? console.log(d); //undifend
? ```
2.一切聲明的全局bian'liang變量嗡善,quan'shi全是windowde屬性的
eg:? ``` var a=123 =====>window.a=123 ```
######預編譯 四部曲
函數預編譯發(fā)生在函數發(fā)生前一刻,
①函數體創(chuàng)建AO(Activation object 也叫執(zhí)行期上下文)對象
②找形參和變量聲明,將變量和形參名作為AO屬性名菩鲜,值為undefined
③將實參值和形參統(tǒng)一
④在函數體里面找函數聲明,值賦予函數體
全局的預編譯:
①函數體創(chuàng)建GO對象
②找變量聲明惦积,將變量名作為GO屬性名接校,值為undefined
③找函數聲明,值賦予函數體
④代碼走到每一步狮崩,執(zhí)行每行代碼(賦值操作等)
eg:
```
? ? var a = 100;
? ? var b = 200;
? ? console.log("f=" + f);// f=function f() { }
? ? var f = 100;
? ? console.log("f=" + f);// f=100
? ? function f() { }
? ? console.log(f);// 100
? ? function fn(a) {
? ? ? ? console.log("a =" + a)? //a=function a() { }
? ? ? ? if (a) {
? ? ? ? ? ? a = 400;
? ? ? ? ? ? function e() {
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? console.log(a);// 400
? ? ? ? function a() { }
? ? ? ? console.log(a);// 400
? ? ? ? console.log(b);// undefined
? ? ? ? var b = function () { }
? ? ? ? console.log(b);? //function b()
? ? ? ? function d() {
? ? ? ? }
? ? }
? ? fn(300);
//---------------------全局GO 流程--------------------------
? ? // ②GO{
? ? //? ? a:undefined,
? ? //? ? b:undefined,
? ? //? ? f:undefined,
? ? // }
? ? // ③ GO{
? ? //? ? a:100,
? ? //? ? b:200,
? ? //? ? f:? function f() { }
? ? // }
? ? // ④代碼執(zhí)行到某一行蛛勉,某一行的變量就被賦值
? ? //----------------fn AO 流程-------------------------------
? ? // fn函數執(zhí)行前預編譯
? ? // ②AO{
? ? //? ? a:undefined鹿寻,
? ? //? ? b:undefined,
? ? //? ? d:undefined诽凌,
? ? //? ? e:undefined
? ? // }
? ? //③ AO{
? ? //? ? a:300
? ? //? ? b:undefined烈和,
? ? //? ? d:undefined,
? ? //? ? e:undefined
? ? // }
? // ④AO{
? ? //? ? a: function a() { }
? ? //? ? b:undefined皿淋,
? ? //? ? d: function d() { }
? ? //? ? e:function e() { }
? ? // }
? ? //⑤代碼走到哪一句招刹,如果有賦值就賦值
```