在chrome浏览器中打开一个网页时,html代码和js代码经过浏览器内核的处理会生成Dom Tree,其中:
- html代码的解析(parser)由浏览器内核的一部分完成;
- js代码的dom操作则由浏览器内核组成部分之一V8引擎完成执行
### v8引擎定义
- 由C++编写的开源的javascript和webAssembly引擎,用在chrome(chrome内核)和node.js中
- v8可以独立运行,也可以嵌入任何C++应用程序(如node.js)
### v8引擎运行原理
1. js源代码经过解析(parse)生成AST抽象语法树,其中parse过程:
- 词法分析:对js源代码每个词作切割,生成tokens(由多个对象组成的数组,包含代码词的类型等信息);
- 语法分析:根据词法分析的tokens生成AST抽象语法树,可以访问astxplorer.com体验一下js代码转AST的过程。
2. AST经过ignition处理后生成跨操作系统的字节码
3.根据具体运行环境生成CPU可执行的机器码(二进制码),输出运行结果
ps:
- 一些频繁调用的函数,每次都要转成字节码再生成机器码太麻烦,利用TurboFan库,根据收集代码的执行频率等信息,可将经常执行的函数代码直接转换成优化的机器码(不再经过转成字节码的过程)
- 但js十分灵活,若在执行函数时,传入了不同值类型的参数,如number之间相加、string之间相加等,两者的运行机器码是不同的。这种情况下机器码会被"反优化"转成字节码,优化后再经过TurboFan转成机器码。
(所以在执行js代码函数时,最好传入固定类型的值)