JS事件循环
JavaScript是一门单线程语言,也就是同一时间只能处理一件事。但是有些时候,比如:定时任务、请求数据等如果顺序执行会造成阻塞,于是有了事件循环。事件循环本身实际上是对JS执行过程中不同类型事件执行顺序的规定。
JS事件循环
JavaScript是一门单线程语言,也就是同一时间只能处理一件事。但是有些时候,比如:定时任务、请求数据等如果顺序执行会造成阻塞,于是有了事件循环。事件循环本身实际上是对JS执行过程中不同类型事件执行顺序的规定。
在JavaScript中,共有三种任务类型:宏任务、微任务和普通的同步任务。
宏任务
- script(整体代码
- setTimeout()
- setInterval()
- postMessage
- I/O
- UI交互事件
微任务:
- new Promise().then(回调)
- MutationObserver(html5 新特性)
首先JS是顺序执行的,且为解释型语言,所有同步代码按照顺序进入主线程执行栈中执行,然后出栈,接着下一行同步代码。
当遇到宏任务时会将宏任务放入宏任务队列中,比如setTimeout,会进入宏任务队列中计时,等到计时完成会进入任务队列中排队,等待主线程全部结束后再进入任务队列中查看是否有要执行的任务。
当遇到微任务时,微任务也会进入微任务队列中排队,但是微任务的优先级是要高于宏任务的,也就是主线程结束工作后会优先查看微任务队列,等到微任务队列执行完毕后才会查看宏任务队列,这样循环往复,就形成了事件循环。