javascript之詞法分析

JavaScript執行順序是自上而下的這是毋庸置疑的,在javascript執行之前還要進行詞法分析,所以javascript整個運行過程包括兩個部分,即詞法分析過程和執行過程。下面來梳理一下javascript的運行過程:

 在開始運行前會創建一個Active Object,下面簡稱AO。

0.創建AO {}。

1.

1.1分析形參,將所有的形參添加到AO上作爲AO的屬性,值爲undefined。

1.2將方法傳值賦給對應的形參。

2. 分析由var 聲明的變量,將變量添加到AO上,注意此時只是添加變量,值還是undefined。

3.分析函數聲明,將函數添加到AO上。

4.詞法分析完畢,按順序執行語句。

下面看幾個例子:

eg1:

var str1 = 'global';
function t1(){
    console.log(str1);// undefined
    console.log(str2);// 報錯 str2 is not defined
    var str2 = 'local';
}
t1();
/*
0.創建AO {}。
1.
    1.1分析形參,沒有
2.分析由var聲明的變量,分析到str2,將str2添加到AO上AO{str2:undefined}。
3.分析函數聲明,沒有。
4.詞法分析完畢,按順序執行語句。

*/

eg2:

function t1(a){
    var a = 2;
    alert(a);
    function a(){
        alert(a);    
    }
    a();
}
t1(1);
//結果 2, 報錯 number is not defined
/*
0.創建AO {}。
1.
    1.1分析形參,有a,將a添加到AO上AO{a:undfined}.
    1.2分析到實參,添加到AO上AO{a:1}.
2.分析由var聲明的變量,分析到a,AO中有a,AO{a:undfined}。
3.分析函數聲明,a函數添加到AO中,AO{a:function}
4.詞法分析完畢,按順序執行語句。給a賦值2,於是就有了上面的結果。
*/

eg3:

function t1(a){
    alert(a);
    function a(){
        alert(a);    
    }
    a();
}
t1(1);
//結果 function,function
/*
0.創建AO {}。
1.
    1.1分析形參,有a,將a添加到AO上AO{a:undfined}.
    1.2分析到實參,添加到AO上AO{a:1}.
2.分析由var聲明的變量,沒有。
3.分析函數聲明,a函數添加到AO中,AO{a:function}
4.詞法分析完畢,按順序執行語句。於是就有了上面的結果。
*/

eg4:

function t1(a){
    alert(a);
    a = function (){
        alert(a);    
    }
    a();
}
t1(1);
//結果 1,function
/*
0.創建AO {}。
1.
	1.1分析形參,有a,將a添加到AO上AO{a:undfined}.
    1.2分析到實參,添加到AO上AO{a:1}.
2.分析由var聲明的變量,沒有。
3.分析函數聲明,沒有
4.詞法分析完畢,按順序執行語句。於是就有了上面的結果。
注意:其中的函數表達式和函數聲明的區別
*/

如果存在多層函數嵌套,詞法分析是從外到內分析的。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章