预编译发生在函数执行的前一刻。
预编译四个过程如下:
1、创建AO对象(Activation Object即执行期上下文);
2、找形参和变量声明,将形参和变量名作为AO属性,值为undefined;
3、将形参值与实参值统一;
4、在函数体内找函数声明,赋值与予函数体;
例子如下:
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对象并找到形参与变量名作为AO属性(同一个变量名声明多次在AO对象里面只挂载一次):
OA:{
a:undefined,
b:undefined
}
其次将形参与实参的值统一,即AO对象的a属性值为1:
OA:{
a:1,
b:undefined
}
最后在函数体内找函数声明,并赋值:
OA:{
a:function a() {},
b:undefined,
d:function d() {}
}
开始函数执行:
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 b(){}
function d() {}
}
fn(1);
如果有上面所述有不正确的地方,请帮忙指出。