js变量提升和函数提升

我们都知道,js是存在「变量提升」的。

JS

关于「变量提升」,我们来看个例子:

console.log(a) // undefined
var a = 1

一个变量还没被声明我们就去使用它,竟然不报错,而是返回undefined。

这就是因为「变量提升」。

我们可以把上面的代码这样来看:

var a
console.log(a) // undefined
a = 1

现在知道为什么打印undefined了吧。

再看个例子:

var a = 10
var a
console.log(a)

你是不是觉得打印值是undefined?

不,应该是10。

为什么是10?因为变量提升:

var a
var a
a = 10
console.log(a) // 10

通过上面这些例子,我们就知道,用var声明的变量会出现「变量提升」的情况。

其实,不仅变量会提升函数也会被提升。

console.log(a) // f a() {}
function a() {}
var a = 1

对于上面代码,打印结果会是f a() {},即使变量声明在函数之后。

这说明了函数会被提升,且优先于变量提升。(「函数提升优先于变量提升」是说,函数提升会把整个函数挪到作用域顶部,变量提升只会把声明挪到作用域顶部)