js预编译
预编译是上下文创建之后,js代码执行前的一段时期,在这个时期,会对js代码进行预处理
全局预编译
全局上下文创建后,会生成变量对象VO,VO首先寻找变量声明,将var声明的变量作为VO对象的属性名,值为undefined。然后寻找函数声明,属性值为函数本身,如果函数名与变量名冲突,函数声明会将变量声明覆盖
console.log(a)
var a = 100
function a() {}
console.log(a)
输出结果展示
funA
100
函数预编译
函数上下文创建后,会生成变量对象AO
- 寻找变量声明,变量名为AO对象的属性名,属性值为undefined
- 寻找形参,形参名作为AO对象的属性名,属性值置为undefined
- 将实参的值赋予形参,及替换AO对象中形参的属性值
- 寻找函数声明,函数名为AO对象的属性名,属性值为函数本身
- 如果函数名与变量名冲突,函数名会将变量声明覆盖 例如
function a(b,c) {
console.log(b)
var b = 0
console.log(b)
var b = function() {
console.log('bbbb')
}
console.log(c)
console.log(b)
}
a(1)
输出结果
{
1
0
undefined
funB
}
面试案例:
function fn(a,c) {
console.log(a)
var a = 123
console.log(a)
console.log(c)
function a() {}
if(false) {
var d = 678
}
console.log(d)
console.log(b)
var b = function () {}
console.log(b)
function c () {}
console.log(c)
}
fn(1,2)
输出结果:
{
funA
123
funC
undefined
undefined
funB
funC
}