首先,我们要知道javascript是解释型语言(解释型:逐行解析,逐行执行) 那么,什么是预编译呢? 在javascript真正被解析之前,js解析引擎会首先把整个文件进行预处理,以消除一些歧义。这个预处理过程就被称为预编译
示例:
console.log(a)
var a = 123
console.log(a)
function a(){
console.log(a)
}
a()
结果如下:
【拓展:在同一个文件中,如果有多个script便签,所有的script便签会被js引擎合在一起,生成统一的全局对象】
为什么会出现以上运算结果,这就是预编译的作用了,以下为全局预编译:
-
生产window对象
-
查找变量的声明, 把a作为window对象的属性名,属性的值undefined
-
查找函数的声明,把函数名a作为window对象的属性名,属性值是function
全局预编译结束,结束后,代码从上到下依次执行
- a的值改为100
上面2,3就是大家所说的声明提前,即:var声明的变量和function声明的函数会变量提升。