事件循环

Martin

javaScript是一门解释性语言

谁来解释? 浏览器、nodejs中的v8引擎

谁来执行? CPU

执行后的结果谁处理? 渲染至页面

javascript引擎

  • V8(Google)
  • javaScriptCore (apple)
  • Rhino (Mozilla基金会)
  • SpiderMonkey (Mozilla)

以V8为例

  1. 开始执行javascript代码
  2. V8解析源代码并转化(parser)为AST抽象语法树
  3. 基于AST,由Ignition解释器解释并产出字节码
  4. 同时开始运行代码并收集类型反馈
  5. 引擎可以检测某些行为是否经常发生,以及使用的数据类型,为了使其运行得更快,字节码可以和反馈数据一起被发送到优化编译器。优化编译器在此基础上作出某些假设,然后产生高度优化的机器代码(内联缓存技术
  6. 如果某时候,其中由一个假设被证明是不正确的,优化编译器就会取消优化,并回到解释器

编译器工作流程

(1)从上往下依次解析代码

(2)判断代码是同步还是异步

    (2.1)如果同步,立即执行

    (2.2)如果异步,则不执行,会放入事件队列(事件循环 EventLoop)

(3)页面所有的同步执行完毕,才开始执行事件队列中的异步代码

事件循环:

有同步任务先执行同步任务,遇到异步任务则放入事件队列,任务又分
  1. 宏任务:setTimeout、setInterval、Ajax请求、dom事件
  2. 微任务:Promise、async\await

微任务的执行时机比宏任务要早