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(){} //函数体
}
接下来就是函数执行,函数执行要按照顺序来,也就是一行一行的执行。
————————————————
版权声明:本文为CSDN博主「oito」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wls666/article/details/88872212