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.詞法分析完畢,按順序執行語句。於是就有了上面的結果。
注意:其中的函數表達式和函數聲明的區別
*/
如果存在多層函數嵌套,詞法分析是從外到內分析的。