变量提升(预解析)

819 阅读1分钟

从事前端一定时间后,变量提升其实是非常常见的问题。

先从一个简单的例子入门:

a = 2
console.log(a)
var a

你觉得上部代码会输出什么?是undefined?还是not define?如果按照程序自上到下的执行顺序,那么会输出a is not define,然而,JavaScript并不是我们所理解的严格自上到下的执行顺序。

JavaScript执行顺序

javaScript运行的机制其实是:先编译再执行

如图,一段代码执行时,JavaScript在执行前会进行预编译,之后再进行执行

变量提升

那么问题来了,这个预解析预编译做了什么呢? 做了两个事:

  1. 会对当前作用域所有变量声明提升到程序的顶部并赋值undefined
  2. 会对当前作用域所有方法声明和定义提升到程序的顶部

举个例子

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

总结

本文只要弄明白变量声明就是预解析:

  1. 会对当前作用域所有变量声明提升到程序的顶部并赋值undefined
  2. 会对当前作用域所有方法声明和定义提升到程序的顶部