简述事件循环

js执行栈

js线程执行任务时,会创建js执行栈。同步任务直接推入执行栈中执行,异步任务推入事件队列中,注册回调函数。当执行栈空闲时,js会去事件队列中读取事件当初注册的回调函数,到执行栈中,并执行函数。

事件队列中异步任务划分

异步任务分为宏任务和微任务。
宏任务:script, settimeout,ajax请求,dom事件,I/O、定时器、事件绑定
微任务:Promise.then、MutationObserver、process.nextTick()
注意:Promise的then等方法是微任务,而Promise中的代码是同步任务,并且,nextTick的执行顺序优先于Promise的then等方法,因为nextTick是直接告诉浏览器说要尽快执行,而不是放入队列
js中,微任务总是先于宏任务执行,也就是说,这三种任务的执行顺序是:同步任务>微任务>宏任务
当宏任务执行完,执行栈空闲时,js首先会将队列中的所有微任务执行完,再去执行宏队列中的宏任务。如此反复,就是事件循环了。
一轮循环是这样的:是一次宏任务加上当前所有微任务执行。当js执行时,先执行宏任务(其实,就是当前宏任务中所有的同步任务),遇到微任务,则推入微队列,并注册回调函数。当该次宏任务执行完后,会读取微任务注册的回调函数到执行栈中执行。执行完后。继续下一轮循环。
————————————————