js預編譯 --預編譯詳解四部曲

小趙學習發表於2020-10-31

預編譯

首先看一個例子

 var a = 10
 console.log(a);  //輸出為10
console.log(a) //輸出為undefined
var a = 10

出現這種情況的原因是:js解釋型語言 ,也就是解釋一行執行一行,第一種情況是正常輸出,第二種之所以會輸出undefined 而不是報錯就是歸功於預編譯

js程式碼執行分為三步:

1,語法分析

2,預編譯

3,解釋執行

語法分析就是通篇檢查你的程式碼有沒有低階錯誤

預編譯發生在程式碼執行的前一刻

解釋執行就是執行你的程式碼

預編譯的前奏

1,imply global 暗示全域性變數 : 也就是任何沒有經過宣告的變數 此變數歸全域性(window)所有

b=123 //相當於  window.b = 123  暗示全域性變數

2,一切宣告的全域性變數 歸window所有

var a =123 //相當於 window.a = 123

預編譯的粗淺理解(這種理解可以用來解決簡單的預編譯問題):

函式宣告整體提升 和 變數,宣告提升

當問題變得複雜,只有更透徹的理解才能理清頭緒

預編譯精裝:

預編譯四部曲:

1,建立GO/AO物件 GO:global object AO:avtive object
2,找形參和變數宣告,將變數和形參名作為AO的屬性名 值為undefined
3,將實參和形參相統一(也就是吧AO物件中的形參屬性的值變成實參的值)
4,在函式體找函式宣告 賦值給函式體

全域性預編譯 生成GO === window

在全域性預編譯完成後進行全域性的程式碼解釋執行 只有在遇到函式呼叫的時候才會觸發函式區域性的預編譯

區域性預編譯生成AO

function f(a){
console.log(a)  //function(){}
var a = 123
console.log(a)  //123
function a(){}
var b = function(){}  //function(){}
function d(){}
}
f(1)

在這個函式中進行預編譯:

1,建立AO物件 AO={ }

2;找形參和變數宣告 將變數和形參名作為AO的屬性名 值為undefined

AO={
    a:undefined,
    b:undefined
}

3,將實參和形參相統一

AO={
a:1,
b:undefined
}

4,在函式體找函式宣告 賦值給函式體

AO = {
a:function(){}
b:undifined
d:function(){}
}

當預編譯完成後開始執行其他程式碼

相關文章