JavaScript预编译包括AO(为函数执行上下文)和GO(为全局执行上下文)。
AO(Activation Object):活动对象,是函数执行上下文中的一个对象,用于存储函数中的变量,函数声明以及参数等,每当一个函数被调用时,都会创建一个新的活动对象。
GO(Global Object):全局对象,是全局执行上下文中的一个对象,用于存储全局范围内的变量核函数。全局对象在JavaScript代码执行前就被创建,并且在整个程序的声明周期内存在。
1、AO示例及过程
AO执行步骤:
1、寻找函数内的形参和变量声明(var变量声明会提升)
2、实参值赋值给形参
3、找函数声明,赋值函数体
4、执行(预编译剩下的再进行执行)
function test(a){
console.log(a);//function a(){}
var a = 1;
console.log(a);//1
function a(){};
console.log(a);//1
var b = function(){};
console.log(b);//function(){}
function d(){};
};
test(2)
/*
Ao:执行步骤
1、寻找函数内的形参和变量声明(变量声明会提升)
2、实参值赋值给形参
3、找函数声明,赋值函数体
4、执行(预编译剩下的再进行执行)
AO:执行过程{
a:undefined->2->function a(){}->1
b:undefined->function(){}
d:function d(){}
}
*/
2、GO示例及过程
GO执行步骤:
1、找变量声明;
2、找函数声明;
3、执行。
console.log(a,b);//function a(){},undefined
function a(){};
var b = function(){} ;
/*
GO:执行步骤
1、找变量声明
2、找函数声明
3、执行
GO:执行过程{
b:undefined->function(){}
a:function a(){}
}
*/
3、AO、GO混合示例及过程
a =1;
function test(){
console.log(a);//undefined,AO里面有a的值,就不去GO里面找了,所以取不到GO的值1
a = 2;
console.log(a);//2
var a = 3;
console.log(a);//3
}
test();
var a;
console.log(a);//1
/*
执行过程:
AO={
a:undefined->2->3
}
GO={
a:undefined->1
test:function test(){...}
}
*/