JS之预编译(详解)
JS运动过程:
- 语法分析
- 预编译
- 解释执行
语法分析就是JS引擎去检查你的代码是否有语法错误,解释执行顾名思义就是执行你的代码。当然最重要的还是预编译,那么预编译是在什么时候开始发生呢?,接下来就是重点了。
首先要明白什么是函数声明?,什么是变量赋值?
function a() //函数声明
var a = function (){}//变量赋值(函数表达式)
预编译(函数执行的前一刻):
-
创建AO对象(Activation Object)(执行上下文);
-
找函数形参和函数内变量声明,将形参名和变量名作为AO对象的属性名,值为undefined;
-
将实参值和形参统一,实参值赋给形参;
-
在函数体里面找函数声明,值赋予函数体。
请看下面这个例子:
function fn(a){
console.log(a);
var a = 123;
console.log(a);
function a() {} //函数声明
console.log(a);
var b = function(){}//变量赋值(函数表达式)
console.log(b);
function d(){}//函数声明
}
fn(1);
输出结果:
解题步骤:
第一步:声明一个AO对象(Activation Object)(执行上下文),执行上下文就是由于这个函数执行产生的一个存储空间库;
AO{
}
第二步: 找函数形参和函数内变量声明,将形参名和变量名作为AO对象的属性名,值为undefined;
AO{
a:undefined, //形参a
b:undefined //变量b
}
第三步:将实参值和形参值统一(也就是说把实参值传到形参中)
AO{
a:1,//形参a
b:undefined //变量b
}
第四步:在函数体里面找函数声明,值赋予函数体
AO{
a:function a(){}, //函数体
b:undefined, //变量b
d:function b(){} //函数体
}
接下来就是函数执行,函数执行要按照顺序来,也就是一行一行的执行。