事件循环机制(Event Loop)
事件循环分为两种,分别是浏览器事件循环和node.js事件循环,JavaScript是一门单线程语言,也就是说主线程只有一个。事件循环,其实就是JS引擎管理事件执行的一个流程,具体由运行环境确定。目前JS的主要运行环境有两个,浏览器和Node.js。
浏览器的事件循环又分为同步任务和异步任务
1.同步任务:
在主线程上排队执行的任务,只有一个任务执行完毕,才能执行后一个任务。
2.异步任务
不进入主线程,而进入任务队列的任务,只有任务队列通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。
异步任务又分为宏任务( macro )和微任务( micro ) 。所有同步任务都在主线程上执行,形成一个函数执行栈,而异步则先放到任务队列里,任务队列又分为宏任务队列(macro-task)与微任务队列(micro-task)。
-
常见的宏任务有:setTimeout、setInterval、requestAnimationFrame、script等。
-
常见的微任务有:new Promise( ).then(回调)、MutationObserver 等
3.执行顺序
- 主线程依次执行同步代码,
- 遇到异步宏任务则将异步宏任务放入宏任务队列中,
- 遇到异步微任务则将异步微任务放入微任务队列中,
- 当所有同步代码执行完毕后,JavaScript引擎会检查微任务队列,如果有未执行的微任务,则将其执行完毕,
- 微任务执行完毕后再将异步宏任务从队列中调入主线程执行,
- 一直循环直到所有的宏任务和微任务都执行完毕。