JS基础运行知识
JS代码是如何在浏览器中运行的?
- 浏览器通过DNS解析域名为IP地址,访问IP地址返回html文件
- html文件下载完成后,解析html文件
(1) 解析到script标签,就会去服务器下载对应的JS文件
(2) 遇到link标签,就会去服务器下载对应的css文件 - 等到js文件下载完成后,浏览器就会通过浏览器内核,解析运行JS代码
浏览器渲染过程
- 将html解析形成DOM树,此时遇到JS标签则会体质解析html,优先通过JS引擎加载和执行JS代码(这里可能会执行DOM操作),最后形成DOM结构树
- 将css层叠样式表解析成样式规则
- 将DOM树和样式规则组合形成渲染树(RenderTree)并且布局引擎(Layout)进行布局操作
- 绘制引擎(paint)将渲染树绘制并且展示在浏览器页面上
注意: 在html被浏览器解析过程中,如果遇到了JS标签,则会停止解析html,优先加载和执行JS代码
JS引擎(V8引擎)
浏览器内核与JS引擎的关系
浏览器内核包含JS引擎,JS引擎只负责解析和JS代码
V8引擎工作原理
(1) 解析JS源代码(词法解析,语法解析)
(2) 解析后形成AST抽象语法树
(3) 通过Ignition库收集信息并编译成字节码,再把字节码编译成机器码执行运行结果Q: 如果有一段JS代码频繁被使用,每次都把这部分代码转成字节码再编译成机器码会消耗很多性能,该如何解决?
A: Ignition库会将频繁调用的JS代码标记为hot,之后通过TurboFan库转换为优化后的机器码进行存储,下次再调用时直接调用存储的机器码运行Q: 因为JS代码是弱类型语言,如果在一段频繁调用的JS代码使用逻辑运算时,更改了参数类型的值,导致计算方式不一致生成的机器码也不一致,该如何解决?
A: JS引擎会有逆优化(Deoptimization)的操作,反向转为字节码,再通过字节码转为机器码,当然这是一个比较消耗性能的操作
M: 这也是为什么在解析TypeScript转换的JS代码时效率更高的原因之一,TypeScript做了类型的强校验,省去了逆优化的操作Q: JS引擎为什么先转为字节码,再转为机器码,而不是直接转为机器码?
A: 因为机器码比较占内存空间,字节码所占用的空间远远低于了机器码,总结就是牺牲时间来换取空间
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!