javascript中什麼是預編譯

WBOY
發布: 2022-03-10 11:05:39
原創
1926 人瀏覽過

在JavaScript中,預編譯就是程式碼執行前進行的一項操作,會把變數宣告提前,函數宣告也提前,把這些依照一定的規則,放在建立的物件裡面去的一個過程。

javascript中什麼是預編譯

本教學操作環境:windows10系統、javascript1.8.5版、Dell G3電腦。

javascript中什麼是預編譯

js運行三部曲

1.語法分析 : js引擎在解析js程式碼之前,會先通篇掃描一下,找出低階的文法錯誤,例如寫錯大括號之類的。

2.預先編譯 任何的語法和語句全部會被轉換成對象,GO(Global Object),AO(Active Object)把程式碼依照 一定的規則,放到GO和AO中

3.解釋執行 編譯一行執行一行,當語法分析沒有問題,並且已經完成預編譯階段之後,就開始解釋執行程式碼

什麼的預編譯?

預先編譯就是在JavaScript程式碼前進行的一項操作會把變數宣告提前,函數宣告也會提前,把這些程式碼依照一定的規則,放在建立的物件裡面去。

預先編譯的過程:

GO window預編譯

1,在執行script標籤的一瞬間創建一個GO物件

2,尋找變量聲明,變數名作為GO物件的屬性名,值為undefined。

3,尋找函數聲明,函數名稱作為GO物件的屬性名,值為函數體,如果函數名稱和變數名稱一樣,直接覆寫

AO 函數預編譯

1,在函數執行的一瞬間創建一個AO物件

2,尋找實參和形參,將形參作為AO物件的屬性名稱添加到物件中,值為實參,值得注意的是,函數宣告不叫變數。如果沒有實參值就是undefined。

3,找出變數聲明,變數名作為AO物件的屬性名,值為undefined。如果變數名和形參名一樣不用管。

4 ,尋找函數聲明,函數名稱作為AO物件的屬性名,值為函數體,如果函數名和變數名一樣,直接覆寫

下面我們來寫一段程式碼來簡單介紹一哈函數預編譯的過程

function fun(a,b){
    console.log(a);
    var a = 10;
    console.log(a);
    function a(){}
    console.log(a)
    a = 1;
    var b;
    console.log(b);
    var b = function(){}
    console.log(b);
}
fun(1,2);
登入後複製

1首先在執行fun之前會建立一個AO物件。

funAO{
}
登入後複製

2,尋找實參和形參,將形參作為AO物件的屬性名稱加入物件中,值為實參,值得注意的是,函數宣告不叫變數。如果沒有實參值就是undefined。

funAO{
    a : 1,
    b : 2
}
登入後複製
登入後複製

3,尋找變數聲明,變數名作為AO物件的屬性名,值為undefined。如果變數名和形參名一樣不用管

funAO{
    a : 1,
    b : 2
}
登入後複製
登入後複製

4 ,尋找函數聲明,函數名稱作為AO物件的屬性名,值為函數體,如果函數名和變數名一樣,直接覆寫

funAO{
    a : function a(){},
    b : 2
}
登入後複製

解釋執行

function fun(a,b){
    console.log(a);  //往上面的AO对象里面寻找,a的值是function a(){}。 这里就输出function a(){}
    var a = 10;
    console.log(a);//上面一行代码把a赋值10 ,所以这里输出10
    function a(){}
    console.log(a)//这里也是10,因为上面函数已经提前了
    a = 1;
    var b;
    console.log(b);//往上面的AO对象里面寻找,b的值是2。 这里就输出2
    var b = function(){}//这里的函数为啥不能提前,因为这里的是一个函数表达式,这个函数没有函数名所以不能提前。
    console.log(b);//这里把b赋值function(){},所以这里输出function(){}
}
fun(1,2);
登入後複製

還有一個可能

function add(){
//这里的话碰到if判断,for....除了function作用域之外的咱们都得正常分析,
//所以这里的值为undefined其实就是var a提前了赋值undefined
    console.log(a);//这里的输出结果为?undefined
    if(a){
        var a = 10;
    }
    //这里是把a的值传入判断里面undefined返回的是false所以进不去,值就不会改变这里还是undefined
    console.log(a);//undefined
}
add();
登入後複製

這上面就是預編譯的執行過程!

相關推薦:javascript學習教學

以上是javascript中什麼是預編譯的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!