Posts Photo Project

JS事件循环

JavaScript是一门单线程语言,也就是同一时间只能处理一件事。但是有些时候,比如:定时任务、请求数据等如果顺序执行会造成阻塞,于是有了事件循环。事件循环本身实际上是对JS执行过程中不同类型事件执行顺序的规定。

JS事件循环

JavaScript是一门单线程语言,也就是同一时间只能处理一件事。但是有些时候,比如:定时任务、请求数据等如果顺序执行会造成阻塞,于是有了事件循环。事件循环本身实际上是对JS执行过程中不同类型事件执行顺序的规定。

在JavaScript中,共有三种任务类型:宏任务、微任务和普通的同步任务。

宏任务

  • script(整体代码
  • setTimeout()
  • setInterval()
  • postMessage
  • I/O
  • UI交互事件

微任务:

  • new Promise().then(回调)
  • MutationObserver(html5 新特性)

首先JS是顺序执行的,且为解释型语言,所有同步代码按照顺序进入主线程执行栈中执行,然后出栈,接着下一行同步代码。

当遇到宏任务时会将宏任务放入宏任务队列中,比如setTimeout,会进入宏任务队列中计时,等到计时完成会进入任务队列中排队,等待主线程全部结束后再进入任务队列中查看是否有要执行的任务。

当遇到微任务时,微任务也会进入微任务队列中排队,但是微任务的优先级是要高于宏任务的,也就是主线程结束工作后会优先查看微任务队列,等到微任务队列执行完毕后才会查看宏任务队列,这样循环往复,就形成了事件循环。