从事前端一定时间后,变量提升其实是非常常见的问题。
先从一个简单的例子入门:
a = 2
console.log(a)
var a
你觉得上部代码会输出什么?是undefined?还是not define?如果按照程序自上到下的执行顺序,那么会输出a is not define,然而,JavaScript并不是我们所理解的严格自上到下的执行顺序。
JavaScript执行顺序
javaScript运行的机制其实是:先编译再执行
变量提升
那么问题来了,这个预解析预编译做了什么呢? 做了两个事:
- 会对当前作用域的所有变量声明提升到程序的顶部并赋值undefined。
- 会对当前作用域的所有方法声明和定义提升到程序的顶部。
举个例子
showName()
var showName = function(){console.log(1)}
function showName () {
console.log(2)
}
思考一下,会输出什么?
按照上面提到的预编译,他会先进行变量声明:
var showName = undefined
function showName () {
console.log(2)
}
showName()
showName = function(){console.log(1)}
接着按由上到下的执行顺序:会输出 // 2;
那么思考一下,下部会输出什么?
showName()
var showName = function(){console.log(1)}
function showName () {
console.log(2)
}
showName()
没错会先输出 // 2,再输出 // 1
总结
本文只要弄明白变量声明就是预解析:
- 会对当前作用域的所有变量声明提升到程序的顶部并赋值undefined。
- 会对当前作用域的所有方法声明和定义提升到程序的顶部。