在js代码执行之前,会先进行预编译,在预编译时,变量和函数会在提升机制的作用下进行提升,提升为代码的编写带来了诸多不便,这篇文章是我对提升的学习总结。
什么是提升
要回答这个问题,我们先看一段代码
var a=10;
function a(){
console.log("函数运行")
}
a();
这段代码,最后的输出结果应该是输出一个“函数运行”吧。
错!
实际运行起来后会报错,错误提示是“a is not a function”,a不是一个函数。

所谓提升,就是在预编译过程里,js会自动将用var声明的变量、函数移到其作用域的最上面。而且函数提升的优先级高于变量。
于是上面这个例子报错的原因就很好理解了,预编译时函数和变量提升,且函数先提升至最顶端。

变量的提升
用var声明的变量会发生提升,用let声明的变量并不会。。。(明白let的强大之处了吧)
例子:如下代码
var a=10;
console.log(b);
var b=20;
输出结果为

???为什么会输出underfined???,不是变量会提升吗???
原因是这样滴~
这段代码在预编译后实际为:
var a;
var b;
a=10;
console.log(b);
b=20;
所以变量的提升仅仅提升了声明,并不提升赋值。
函数的提升
还是例子:
f();
function f(){
console.log("hello")
}
函数提升至顶端,所以可以调用

再次重申的重要一点:函数提升的优先级高于变量,函数会比变量先提升。
再来个栗子:
f();
var f=function(){
console.log("hello")
}
运行结果为

这个例子可以推断出用函数表达式定义的函数不会发生提升。
结束
在学习js的过程中,有时候会莫名遇到一些问题,有可能就是提升引起的,本文对提升做了简要说明,希望有所帮助。