JavaSript 的预编译模式

预编译模式代码不是从上到下,一行一行解析的! 预编译模式代码不是从上到下,一行一行解析的! 预编译模式代码不是从上到下,一行一行解析的!

编译阶段,解析引擎会把定义式的函数优先执行,也会把所有var变量创建,默认值为 undefined,以提高程序的执行效率! 而变量提升的作用也就符合了这个预编译的模式: 在一个函数体内声明的变量,JS 解析器都会将其移动到函数体的顶部

实例

例 1

var name = "World!"
;(function() {
  if (typeof name === "undefined") {
    var name = "Jack"
    console.log("Goodbye " + name)
  } else {
    console.log("Hello " + name)
  }
})()

分析: 这里面虽然有个 if,但是归于其预编译模式,所以会爬到var name = 'Jack',因此在函数头会添加一行var name,那么 name 就变成了一个函数内的局部变量 最终输出Hello Jack

例 2

;(function() {
  a = 5
  alert(window.a)
  var a = 10
  alert(a)
})()

分析: 这里面还是需要有一个预编译的思想,这样的话就很容易知道 a 也会因为后面的var a = 10而引起变量提升变成一个函数内的局部变量,window.a 其实根本没有被定义过(undefined)

Reference

question:变量提升_SegmentFault Celte