js预编译AO与GO
JS代码编译过程:
1.检查通篇的语法错误,若有错误则不编译执行.
2.预编译.
3.解释一行,执行一行.
js预编译时会创建GO对象与AO对象
GO: global object 即 全局上下文, GO=window对象,GO即操作window,a为全局变量,console.log(a) = console.log(window.a)
AO : activation object 活跃对象,函数上下文,在函数执行之前进行的一个步骤
AO步骤:
1. 创建AO(Activation Object)对象,又叫执行期上下文;
2. 寻找形式参数和变量声明作为AO的属性名,并赋值为undefined;
3. 传入实际参数的值;
4. 在函数体内寻找函数声明,放入作为AO的属性,并赋值为其函数体。
GO步骤:
1. 创建GO(Global Object)对象;
2. 寻找变量声明作为GO的属性名,并赋值为undefined;
3. 寻找函数声明,放入作为GO的属性,并赋值为其函数体。
demo:
function fn(a) {
console.log(a); // function a() {}
var a = 123;
console.log(a); // 123
function a() {
}
console.log(a); //123
var b = function () {}
console.log(b); // function () {}
function d() {}
}
fn(1);
根据预编译以及执行过程得到结果:
function a () {}, undefined, 234,123,123,function () {}