事件循环
javaScript是一门解释性语言
谁来解释? 浏览器、nodejs中的v8引擎
谁来执行? CPU
执行后的结果谁处理? 渲染至页面
javascript引擎
- V8(Google)
- javaScriptCore (apple)
- Rhino (Mozilla基金会)
- SpiderMonkey (Mozilla)
以V8为例
- 开始执行javascript代码
- V8解析源代码并转化(parser)为AST抽象语法树
- 基于AST,由Ignition解释器解释并产出字节码
- 同时开始运行代码并收集类型反馈
- 引擎可以检测某些行为是否经常发生,以及使用的数据类型,为了使其运行得更快,字节码可以和反馈数据一起被发送到优化编译器。优化编译器在此基础上作出某些假设,然后产生高度优化的机器代码(内联缓存技术)
- 如果某时候,其中由一个假设被证明是不正确的,优化编译器就会取消优化,并回到解释器
编译器工作流程
(1)从上往下依次解析代码
(2)判断代码是同步还是异步
(2.1)如果同步,立即执行
(2.2)如果异步,则不执行,会放入事件队列(事件循环 EventLoop)
(3)页面所有的同步执行完毕,才开始执行事件队列中的异步代码
事件循环:
有同步任务先执行同步任务,遇到异步任务则放入事件队列,任务又分- 宏任务:setTimeout、setInterval、Ajax请求、dom事件
- 微任务:Promise、async\await
微任务的执行时机比宏任务要早