预编译(发生在函数执行的前一刻)
1.创建一个AO对象(Activation Object)
2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined,
3.将实参值和形参值统一
4.在函数体里面找函数声明,值赋予函数体
eg: 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);
解析:
1.创建一个AO:{}
2.变量声明和形参=》(形参是a,变量声明是var a 和var b),故为:
AO:{
a:undefined
b:undefined
}
3.将实参和形参相统一(实参:1,形参:a),也就是把实参的值,放入到形参中去,故也就是改变AO中的变量的值
AO:{
a:1
b:undefined
}
4.函数体中的函数声明,函数体中的函数声明则有 function a() {} 和 function d() {} 所以将函数名作为AO对象的属性名挂起(把整个函数体赋值给这个AO的变量)
AO:{
a:function a(){}
b:undefined
}
开始执行函数:
5.打印 第一个 console.log(a),要获取a的值需要去AO中获取
第一个console.log(a)的值为:function a() {}
var a=123,var a 被提升过,但是a=123还是存在 所以 a=123需要进行赋值到AO 操作的是AO变量中的a ,所以需要给AO变量中的a,重新赋值
AO:{
a:123
b:undefined
}
第二个console.log(a)的值为:123
function a(){} 在预编译的时候被提升过,所以不需要在处理
第三个console.log(a) 的值为:123
var b = function () {} var b 在预编译的时候进行提升过,但是B=function () { }没有,所以这个时候需要对AO中的b进行重新赋值
故:
AO:{
a:123
b:function () {}
}
打印 console.log(b)的值为: function () {}