变量提升

简单理解: 使用一个没有定义的变量浏览是会报错的, 但是在变量声明之前使用变量是不会报错的. 这里就是因为变量提升机制.

注: 变量提升只会提升变量名的声明, 而不会提升变量的赋值初始化. 即在声明之前使用变量得到的是 undefined

函数声明提前

简单理解: 我们可以在函数声明之前去调用函数

注: 函数的声明提前相当于将整个函数的声明初始化提前了 (仅针对使用 function 声明的函数, 使用 var fn = function(){} 这种方式声明的函数,仅获得变量提升, 在声明之前是无法调用函数的)

注: 函数提升的优先级大于变量提升的优先级, 即函数提升在变量提升之上

例子1(变量提升))

1
2
3
4
5
console.log(a)
var a = 1

// 结果
// undefined

例子2(函数声明提前)

1
2
3
4
5
6
7
8
fn()

function fn () {
console.log('hello')
}

// 结果
// hello
1
2
3
4
5
6
7
8
fn()

var fn = function () {
console.log('hello)
}

// 结果
// TypeError: fn is not a function

例子3(面试题)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
console.log(a)
a()
var a = 123
function a(){
console.log('hello')
}
console.log(a)

// 结果
// a(){
// console.log('hello')
// }
// hello
// 123

参考1
参考2