js代码是自上而下执行,但是在js代码执行前,会先进行词法分析。所以js自上而下的执行过程分为两个
词法分析和
执行两个阶段。
词法分析主要有三个步骤:
- 分析参数
- 再分析变量的声明
- 分析函数声明
具体步骤如下:
- 函数在运行的瞬间,生成一个活动对象(Active Object),简称AO
- 第一步:分析形参:
- 函数接收形式参数,添加到AO的属性,并且这个时候值为undefine,即AO.age=undefine
- 接收实参,添加到AO的属性,覆盖之前的undefine
- 第二步:分析变量声明:如var age;或var age=18;
- 如果上一步分析参数中AO还没有age属性,则添加AO属性为undefine,即AO.age=undefine
- 如果AO上面已经有age属性了,则不作任何修改
- 第三步:分析函数的声明:
- 如果有function age(){}把函数赋给AO.age ,覆盖上一步分析的值,即
AO.age=function age(){};
举例说明:
function func(age) {
console.log(age);
var age = 25;
console.log(age);
function age() {
}
console.log(age);
}
func(18);
当执行函数func(18)时:
先进行词法分析:
第一步,分析函数参数:
形式参数:AO.age = undefined
实参:AO.age = 18
第二步,分析函数内部局部变量:
第3行代码有var age,但此时第一步中已有AO.age = 18,故不做任何改变
即AO.age = 18
第三步,分析函数声明:
第5行代码有函数age,则将function age(){}付给AO.age,即AO.age = function age() {}
词法分析完成后
运行,
此时的运行过程相当于:
function func(age) {
var age= 18;
//var age = undefine 分析到var age = 25时,因为AO对象已经有age属性了,所以不做任何修改,该语句不成立;若AO对象没有age属性,则该语句成立;
age = function age() {};
console.log(age);
age = 25;
console.log(age);
console.log(age);
}
输出结果:
> function age() {
};
> 25
> 25