一、什么是Event Loop
Event Loop即事件循环,是指浏览器或Node的一种解决javaScript单线程运行时不会阻塞的一种机制,也就是我们经常使用异步的原理。
二、 Event Loop的循环机制
- 同步任务与异步任务进入不同'场所'执行,所有同步任务在主线程上执行,形成一个执行栈,异步任务进入Event Table并注册回调函数。
- 先执行同步任务,同步事件依次进入执行栈。
- 遇到一个同步任务,直接压入栈中并执行,执行完毕后从栈中弹出。
- 当异步任务有了运行结果,Event Table会将这个回调函数移入Event Queue进行等待,当主线程任务内同步任务完成,会从Event Queue中读取对应函数,进入主线程执行。
- 异步任务又分为MacroTask(宏任务)(如:script全部代码、setTimeout、setInterval)与 MicroTask(微任务)(Promise、process.nextTick)
- 执行栈在执行完同步任务后,查看执行栈是否为空,如果执行栈为空,就会去检查微任务(microTask)队列是否为空,如果为空的话,就执行Task(宏任务),否则就一次性执行完所有微任务。
- 每单个宏任务执行完毕后,会再次检查微任务队列是否为空,如果有新的微任务,会先将微任务全部执行,使微任务队列为空,然后再执行宏任务,如此循环。
- 主线程不断重复这些步骤,也就是常说的Event Loop(事件循环)。