声明提升的坑
- 变量声明提升:通过
var
定义(声明)的变量,在定义语句之前就可以访问到,值为undefined
var a = 2
function fn() {
console.log(a)
var a = 1
}
上面的代码将输出undefined
,因为var
声明的变量存在提升,等价于下面这段代码
var a = 2
function fn() {
var a // 屏蔽了外部的变量a,同时自身未被赋值
console.log(a)
a = 1
}
- 函数声明提升:通过
function fn() {}
形式定义的函数,在定义语句之前就可以调用,值为fn
- 为了防止同名变量覆盖同名函数,变量提升要先于函数提升
function a() {}
var a
console.log(typeof a)
上面的代码将输出'function'
,等价于下面这段代码
var a // 变量声明提升要先于函数声明提升
function a() {} // 覆盖了同名的变量a
console.log(typeof a)
if (!(b in window)) {
var b = 1
}
console.log(b)
上面的代码将输出undefined
,等价于下面这段代码
var b
if (!(b in window)) { // b已在前面声明,因此这里b in window返回true
b = 1 // 不执行
}
console.log(b)
var c = 1
function c(c) {
console.log(c)
}
c(2)
上面的代码将报出错误c is not a function
,等价于下面的代码
var c // 变量声明提升
function c(c) { // 函数声明提升
console.log(c)
}
c = 1 // 此处将原本是函数的c,覆盖成了数字1
c(2) // 报出错误