预编译
1. 函数作用域预编译
下列代码会输出什么?
function fn(a, c) {
console.log(a);
var a = 123
console.log(a);
console.log(c);
function a() { }
if (false) {
var d = 6
}
console.log(d);
console.log(b);
var b = function () { }
console.log(b);
function c() { }
console.log(c);
}
fn(1, 2)
答案为:
- 创建了ao对象(仅供引擎访问,我们访问不到)
- 找形参和变量的声明,作为ao对象的属性名,值是undefined
- 实参和形参相统一
- 找函数声明,会覆盖变量的声明
过程:
AO{
a:undefined => 1 => function a() { }
c:undefined => 2 => function c() { }
d:undefined
b:undefined
}
var b = function () { }不是函数声明,是定义函数,所以不会覆盖变量
2. 全局作用域预编译
- 创建GO对象
- 找变量声明,将变量名作为GO对象的属性名,值是undefined
- 找函数声明,值赋予函数体