最近发现一个比较神奇的问题,可以一起看一下
function test(){
console。log(b)
if(a) {
var b = 100
}
c = 234
console.log(c)
}
var a;
test()
a = 10;
console.log(c)
按照理解, 代码执行会报错,然而这段代码运行会输出
undefined
234
234
下面解释下预编译的执行原理
首先会创建全局的GO对象
var Go = {
a: undefined,
test: fn
}
当test 执行时,会创建属于test函数的AO对象
var testAO = {
b: undefined
}
并将变量C提升至全局
var Go = {
a: undefined,
test: fn,
c: 234
}
之后变量a 被赋值为 1
var Go = {
a: 1,
test: fn,
c: 234
}
所以在访问b 变量时会获取test 函数的AO对象,为undefined。