预编译发生在函数执行的前一刻
预编译在函数执行的前一刻完成
function pre(a) {
console.log(a); // ?
var a = 100;
console.log(a); // ?
console.log(b); // ?
var b = function() {console.log("函数b")}
console.log(b); // ?
function a() {console.log("函数a")}
console.log(a); // ?
function c() { console.log("函数c")}
}
pre(10)
在pre函数执行前 发生:
- 创建AO对象
AO(Activation Object) 活跃对象 – 执行期上下文
此时AO对象
AO: {}
- 找形参和变量声明,将两边和形参名作为AO对象的属性名,值为undefined
此时AO对象
AO: {
a: undefined,
b: undefined
}
- 将实参值赋值给形参
此时AO对象
AO: {
a: 10,
b: undefined
}
- 在执行函数(此例为pre函数)体里面寻找函数声明,将函数声明挂到AO对象上
AO: {
a: function a() {console.log("函数a")},
b: undefined,
c: function c() { console.log("函数c")}
}
预编译结束,执行函数体
function pre(a) {
console.log(a); // function a() {console.log("函数a")}
var a = 100; //预编译不会执行语句 所以此时对a进行赋值
console.log(a); // 100
console.log(b); // undefined
//↓ ==> 预编译不会执行语句 所以此时对b进行赋值
var b = function() {console.log("函数b")}
console.log(b); // function() {console.log("函数b")}
function a() {console.log("函数a")} //预编译已将函数定义提升,此句不再执行
console.log(a); // 100
function c() { console.log("函数c")}
}
pre(10)