Event Loop 小记

55 阅读1分钟

执行过程

  • 同步代码按顺序放到Call Stack中执行
  • 遇到异步任务记录下来,时机到了添加到宏任务队列(Call Queue)
    • 如果遇到微任务添加到微任务队列
    • 宏任务和微任务是分开存放的(微任务是ES6规定的,宏任务是浏览器规定的)
  • 如果Call Stack为空,代码执行完毕,Event Loop开始执行
    • Call Stack为空,先尝试DOM渲染,再触发下一次Event Loop
  • 轮询查找Event Loop,如果有就添加到Call Stack中
  • 重复上述过程

DOM事件和Event Loop

dom事件会放到web api中等待用户主动调用,然后放到Call Queue,再移动到Call Stack中执行

  • js是单线程,异步使用回调,基于Event Loop
  • DOM事件也是使用回调,事件是非异步的,但也是基础Event Loop实现的

宏任务和微任务

  • 宏任务:setTimeoutsetIntervalDOM事件、Ajax
  • 微任务:Promise.thenasync/await
  • 微任务比宏任务更早执行

Event Loop和Dom渲染

每次同步代码执行完毕时,都是DOM渲染的时机,如有变化重新渲染,再触发下一次Event Loop

宏任务和微任务区别

  • 宏任务在DOM渲染后触发
  • 微任务在渲染前触发