以V8引擎为例,V8执行js代码的过程如下
1 生成AST抽象语法树
先通过词法分析将代码分解成一个个token,再通过语法分析将这些token根据一定的语法规则转化为AST,生成AST后,接下来会生成执行上下文(this绑定、创建词法环境和变量环境)
2 生成字节码
V8通过AST生成字节码,字节码是介于AST和机器码之间的一种代码,比机器码轻量得多。字节码需要通过解释器转换为机器码然后执行
3 执行
解释器逐行执行字节码
在执行字节码过程中,如果有一段代码重复出现,V8会将其标记为热点代码,V8的编译器会将热点代码编译为机器码保存起来,后面再遇到热点代码时,直接执行相应的机器码。这样的机制下,代码执行的时间越久,会有更多的代码被标记为热点代码,代码执行的效率会越来越高
可以看出,js是解释和编译结合起来执行的,因此js并不是一门完全的解释型语言。这种字节码跟解释器和编译器结合的技术,称为即时编译(JIT)