刚刚做了三个题,都是细节!!!
题一:
function a() {}
var a
console.log(typeof a) // function
// 先执行变量提升, 再执行函数提升
题二:
if (!(b in window)) {
var b = 1
}
console.log(b) // undefined
// 全局执行上下文时,window里已经有了变量b,值为undefined,属于变量提升。
题三:
var c = 1
function c(c) {
console.log(c)
var c = 3
}
c(2) // 报错
/*
全局执行上下文时,window里已经有了变量c,值为undefined,
也有整个c函数,意思在正式开始执行时,整个c函数早就提升过了,
在正式执行时直接跳过不执行函数声明的那块代码,这点可以在浏览器中用断点调试。
所以在执行全局代码前的情况如下:
var c = undefined;
function c(c) {
console.log(c)
var c = 3
}
在执行全局代码时的情况如下:
c = 1
c(2)
这样当然会报错,因为c不是一个函数
*/