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.词法分析完毕,按顺序执行语句。于是就有了上面的结果。
注意:其中的函数表达式和函数声明的区别
*/
如果存在多层函数嵌套,词法分析是从外到内分析的。