JS引擎笔记
JS引擎 #
- 解释执行JS
- 编译阶段
- 通过词法分析tokenize和语法分析parse生成AST,ignition再生成字节码
- 生成变量环境和词法环境,全局执行上下文
- 变量环境,进行声明变量、声明函数提升
- 问题1:同名覆盖,不易察觉
- 问题2: 提升变量没有被及时销毁
- 词法环境,词法块作用域变量(let, const)
- let, const放在这里,解决变量提升的问题
- 代码区存放字节码
- 执行阶段
- ignition逐条解释执行AST
- 全局执行上下文入执行栈底
- 一行一行执行代码区代码
- 遇到函数,将函数执行上下文压入栈
- Outter,引用全局上下文环境
- this,引用函数自身
- 执行函数代码区代码
- 执行完函数,对应上下文出站
- 整个过程形成调用栈
- 执行多次的热点代码通过turbofan编译器JIT编译成机器码,热点代码可以直接执行,提升执行效率
- 事件循环如下图
- 内存结构
- 栈
- 函数调用会在stack上生产frame,frame就是函数的执行上下文
- 堆
- object对象
- 消息队列(浏览器会把相同类型的放到一个队列)https://juejin.cn/post/7186557347215441981
- 微任务队列,优先级最高
- 交互事件队列,优先级高
- 延迟事件队列,优先级低
- 合成页面队列,
- 默认队列,
- idle队列(垃圾回收任务),优先级最低
- 不同场景下(加载阶段、交互阶段、idle阶段),优先级由浏览器动态调整
JS引擎原理 #
- tokenize -》AST-> bytecode
- 基于寄存器的字节码,实现寄存器操作,解释执行
- 基于栈的字节码,op操作栈,解释执行
- 基于AST直接深度优先遍历直接计算
- 解释执行
- 基于while switch 和 dispatch实现
- 基于goto 跳转 next branch
- 推荐JS实践
- keep same type, don’t delete property
- write js as if it has type
- lazy parse by using function
参考 #
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Event_loop
请遵守《互联网环境法规》文明发言,欢迎讨论问题