莫名奇妙出现的"预编译阶段"
众所周知,JS是一种解释型语言而非编译型语言
(下面非常简要地说明一下两种区别)
简要区分编译型语言和解释型语言: 计算机是不能理解高级语言的,更不能执行高级语言,它只能理解机器语言,所以任何高级语言的程序想要运行,都必须先将其转化成计算机语言也就是机器码,而转换的方式有两种:
1.编译:在编译型语言的程序执行之前,需要一个专门的编译过程,将源代码编译成机器语言,以后再运行的时候可以直接使用编译结果
2.解释:解释型语言不需要预先编译,其直接将源代码解释成机器码并立即开始执行。
故作为解释型语言的JavaScript是不具有"预编译"阶段的,窃以为称之为"预处理"更加合适。但它究竟叫什么并不重要,重要的是为什么很多同学都认为JS存在"预编译"阶段,到底是JS的哪种行为导致不少同学都认为它产生了"预编译"呢?在此我们提出了疑问
Q:JS是一种解释型语言,所以预编译是子虚乌有的,那么是哪种行为让人们觉得它产生了预编译呢?
A: 因为词法环境和变量提升
词法环境与变量提升
在介绍词法环境之前,我们先看一下V8中JS编译执行过程,大体上可以看成三个阶段(只是大体上看成这三个阶段,实质上JS引擎要复杂的多,现在只是为了说明例子):
1.分词/词法分析阶段:分词是指将代码进行拆分,如var a = 2,将被拆分为var,a,=,2这样的符号;词法分析是指