js预编译
大家都知道,javascript是解釋性語言,主要特點為解釋一行執(zhí)行一行。
而在js運行時會進行三件事:1.語法分析 2.預編譯 3.解釋執(zhí)行
- 語法分析會在代碼執(zhí)行前對代碼進行通篇檢查,以排除一些低級錯誤
- 預編譯發(fā)生在代碼執(zhí)行的前一刻
- 解釋執(zhí)行就是執(zhí)行代碼
預編譯的作用:
1、函數(shù)聲明整體提升;
即寫出一個函數(shù)聲明,不管寫在哪里,系統(tǒng)總會將其提升到邏輯最前面。
2、變量聲明提升
例如:
document.write(a); var a = 123; //undefinde;即相當于:
var a; //提升 document.write(a); a = 123; //undefinde;而如果直接console.log(a);瀏覽器會進行報錯。//Uncaught ReferenceError: a is not defined (表示a沒有定義);
?
預編譯前奏
1、imply global 暗示全局變量
任何變量,如果變量未經(jīng)聲明就賦值,此變量就為全局對象所有。
例如:
2、一切聲明的全局變量,全是window的屬性;
預編譯四部曲:
1、創(chuàng)建AO(Activation object)對象
2、找形參和變量聲明,將變量聲明的名(即變量和形參名)作為AO屬性名,值為undefined;
3、將實參和形參統(tǒng)一;
4、在函數(shù)體里面找函數(shù)聲明,值賦予函數(shù)體(注意此處的函數(shù)聲明要區(qū)別于函數(shù)表達式)
//例題 function fn(a){console.log(a);var a = 123;console;log(a);funtion a() {};console.log(a);var b = function() {};console.log(b);function d() {}; } fn(1);真正的預編譯
多了一個全局的GO{}對象
即先創(chuàng)建創(chuàng)建GO/AO對象; (Global Object):全局對象;
//例如: globl = 100; function fn(){console.log(global); //undefined;global = 200;console.log(global); //200;var global = 300; } fn();其中GO{
global : 100;
}
AO{
global : undefined;
}
在執(zhí)行時,函數(shù)會先在其AO{}對象內找相應的變量,如果AO{}中沒有,再在全局變量GO{}內尋找。
//例題: function test(){console.log(b); //undefined;if (a) {var b = 100;}console.log(b); //undefined 因為在if語句里,此時的a值還為undefined,//所以b不進行賦值。而預編譯是不管if()先執(zhí)行的。c = 234;console.log(c); //234; } var a; test(); a = 10; console.log(c); //234;GO{
a:undefined;
c:234;
}
AO{
a:undefined;
b:undefined;
}
注:此處的AO{}發(fā)生在全局調用test()之后,a=10之前;?
?
?
?
?
?
?
?
?
總結
- 上一篇: UID-04-PS-书籍装帧
- 下一篇: controll层跳转页面_View 跳