JavaScript是解释型语言,不像c/java语言是编译型语言,它是边解释边执行,但并不是一行一行的执行,而是以代码块的方式去解释执行(代码块可以理解为script标签包括的代码)
JavaScript解析编译过程
JavaScript代码被执行之前浏览器引擎会做如下操作:
对代码进行预编译,进行类型检查和错误检查 对代码进行词法分析,生成词法单元,JavaScript使用的是静态词法分析 对词法单元进行语法分析,解析生成AST, 也就是抽象语法树 通过解析器把AST转化为字节码 通过编译器把字节码转化为可以被执行的机器码
以上是JavaScript被解析执行的整个过程,浏览器v8引擎在此过程中对JavaScript做了很多优化
JavaScript运行过程
为了提升性能,v8生成本地代码后,使用数据分析器采集一些信息,然后根据这些数据将本地代码进行优化,生成更加高效的本地代码,运行阶段过程如下:
-
先根据需要编译和生成这些本地代码
-
在v8中,函数是一个基本单位,当某个js函数被调用时,V8会查找该函数是否生成本地代码,如果已经生成,则直接调用该函数,否则生成本地代码
-
执行编译后的代码为JavaScript构建JS对象,这需要Runtime类来辅助创建对象,并需要从Heap类分配内存
-
借助Runtime类中的辅助函数来完成一些功能,如属性访问等。最后,将不用的空间进行标记清除和垃圾回收