理解js作用域和闭包(1)—— 全局预编译

102 阅读1分钟

首先,我们要知道javascript是解释型语言(解释型:逐行解析,逐行执行) 那么,什么是预编译呢? 在javascript真正被解析之前,js解析引擎会首先把整个文件进行预处理,以消除一些歧义。这个预处理过程就被称为预编译

示例:

console.log(a)
var a = 123
console.log(a)
function a(){
    console.log(a)
}
a()

结果如下:

image.png

【拓展:在同一个文件中,如果有多个script便签,所有的script便签会被js引擎合在一起,生成统一的全局对象】

为什么会出现以上运算结果,这就是预编译的作用了,以下为全局预编译:

  1. 生产window对象

  2. 查找变量的声明, 把a作为window对象的属性名,属性的值undefined

  3. 查找函数的声明,把函数名a作为window对象的属性名,属性值是function

全局预编译结束,结束后,代码从上到下依次执行

  1. a的值改为100

上面2,3就是大家所说的声明提前,即:var声明的变量和function声明的函数会变量提升。