js预编译
大家都知道,javascript是解釋性語言,主要特點為解釋一行執行一行。
而在js運行時會進行三件事:1.語法分析 2.預編譯 3.解釋執行
- 語法分析會在代碼執行前對代碼進行通篇檢查,以排除一些低級錯誤
- 預編譯發生在代碼執行的前一刻
- 解釋執行就是執行代碼
預編譯的作用:
1、函數聲明整體提升;
即寫出一個函數聲明,不管寫在哪里,系統總會將其提升到邏輯最前面。
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 暗示全局變量
任何變量,如果變量未經聲明就賦值,此變量就為全局對象所有。
 例如:
2、一切聲明的全局變量,全是window的屬性;
預編譯四部曲:
1、創建AO(Activation object)對象
2、找形參和變量聲明,將變量聲明的名(即變量和形參名)作為AO屬性名,值為undefined;
3、將實參和形參統一;
4、在函數體里面找函數聲明,值賦予函數體(注意此處的函數聲明要區別于函數表達式)
//例題 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{}對象
即先創建創建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;
 }
在執行時,函數會先在其AO{}對象內找相應的變量,如果AO{}中沒有,再在全局變量GO{}內尋找。
//例題: function test(){console.log(b); //undefined;if (a) {var b = 100;}console.log(b); //undefined 因為在if語句里,此時的a值還為undefined,//所以b不進行賦值。而預編譯是不管if()先執行的。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{}發生在全局調用test()之后,a=10之前;?
?
?
?
 ?
?
?
?
?
總結
 
                            
                        - 上一篇: UID-04-PS-书籍装帧
- 下一篇: controll层跳转页面_View 跳
