事件循环EventLoop

100 阅读2分钟

事件循环

  • Javascript是单线程非阻塞的脚本语言,单线程是执行代码时只有一个主线程处理所有任务。

  • 非阻塞是代码处理异步任务时,主线程会挂起(pending)这个任务,当异步任务处理完毕后,主线程再根据一定规则去执行相应回调。

  • 当异步任务处理完毕后,Javascript会将这个事件加入一个队列中,这个队列就是事件队列。被放入事件队列中的事件不会立刻执行回调,而是等待当前执行栈中的所有任务执行完毕后,主线程会去查找事件队列中是否有任务。

  • 异步任务有两种类型:微任务(microtask)和宏任务(macrotask)。不同类型的任务会被分配到不同的任务队列中。

  • 当执行栈中的所有任务都执行完毕后,会去检查微任务队列中是否有事件存在,如果有,就会依次执行微任务队列中事件对应的回调,直到为空。

  • 然后去宏任务队列中取出一个事件,把对应的回调加入当前执行栈,当执行栈中的所有任务都执行完毕后,检查微任务队列中是否有事件存在。

  • 无限重复此过程,就形成了一个无限循环,这个循环就叫作事件循环。

  • 微任务:

  • Promise.then

  • MutationObserver

  • Object.observe

  • process.nextTick

  • 宏任务:

  • setTimeout

  • setInterval

  • setImmediate

  • MessageChannel

  • requestAnimationFrame

  • IO

  • UI交互事件

image.png

  • 事件循环机制从整体上告诉我们Javascript代码的执行顺序,event loop 即事件循环,是指浏览器或Node的一种解决Javascript单线程运行时不会阻塞的一种机制,也就是我们经常使用的异步原理。

  • 事件循环会执行队列中的下一个任务,是Js引擎中的一段程序,负责监控代码执行并管理任务队列。

  • 先执行宏任务队列中的一个任务,然后执行微任务队列全部任务,然后开始下一轮事件循环,继续先执行宏任务队列一个任务,再执行微任务队列全部任务。

  • 宏任务:script/setTimeout/setInterval/setImmediate/IO/UI Rendering

  • 微任务:process.nextTick/Promise

  • 优先级

  • setTimeout=setInterval 一个队列

  • setTimeout > setImmediate

  • process.nextTick > Promise