预编译发生在函数执行的前一刻
预编译的四个过程
1.创建 AO 对象(也称执行期上下文,是作用域链的一部分);
2.找形参和变量声明,将形参个变量声明作为 AO 属性名,值为 undefined;
3.将实参值和形参值统一;
4.在函数体里面找函数声明,值赋予函数体
例子1:
function fn(a) {
console.log(a); // function
var a = 123; // a = 123
console.log(a); // 123
function a() {} // 已提升,就不用管了
console.log(a); // 123
//下面这句话不是函数声明,是函数表达式
var b = function() {} // b = function() {}
console.log(b); // function
function d() {}
}
fn(1);
//1.创建 AO 对象
AO {
}
//2.找形参和变量声明,值为undefined
AO {
a: undefined,
b: undefined,
}
//3.将实参值和形参同一
AO {
a: 1,
b: undefined,
}
//4.在函数体里找函数声明,值赋予函数体
AO {
a: function a() {},
b: undefined,
d: function d() {}
}
//5.执行函数
例子2:
function test(a, b) {
console.log(a); // 1
c = 0;
var c;
a = 3;
b = 2;
console.log(b); // 2
function b() {}
function d() {}
console.log(b); // 2
}
test(1);
例子3:
function test(a, b) {
console.log(a); // function
console.log(b); // undefined
var b = 234;
console.log(b); // 234
a = 123;
console.log(a); // 123
function a() {}
var a;
b = 234;
var b = function() {}
console.log(a); // 123
console.log(b); // function
}
test(1);
网友评论