JS作用域(1)- 预编译
2018-10-30 本文已影响0人
zh2443
本篇文章开始说道js的作用域知识,本篇主要讲前奏的预编译。
JS执行三部曲
js的执行分为三步:
1. 语法分析
2. 预编译
3. 解释执行
语法分析:通篇分析程序是否有语法错误;解释执行:即读一句程序执行一句;而预编译作为一个很重要的环节,主要发生在程序执行之前的一刻,对于函数,预编译发生在函数执行之前,所以对于预编译来说,分成2部分:整个程序执行前的预编译和函数执行前的预编译,它们的过程是相同的,只是一个生成GO对象,一个生成AO对象。
预编译四部曲
1. 创建AO(Activation Object 执行期上下文)或GO(Global Object 全局执行期上下文,也即window对象)对象
2. 找形参和变量声明,将它们作为对象的属性名,值赋值为undefined
3. 将实参和形参统一(实参的值赋值给形参)
4. 找函数声明,将函数名作为对象属性,值赋值为函数体
以上即为预编译的四个步骤,下面做实例讨论:
1. 创建AO
AO = { };
2. 找形参和变量声明
AO = {
a : undefined,
c : undefined,
b :undefined
};
3. 实参形参统一
AO = {
a : 1,
c : undefined,
b :undefined
};
4. 找函数声明
AO = {
a : function a(){},
c : undefined,
b :undefined,
d : function d(){}
};
预编译完成后,执行函数,得到如下结果:
注意:
1. 条件语句对预编译生成AO或GO对象没有任何影响,里面的变量或函数声明依然会加到对象中;
2. 预编译是生成执行期上下文,在函数执行时,会进行上下文属性的赋值工作。