JavaScript 的事件循环(Event Loop)是其执行异步操作的核心机制。事件循环主要包括以下几个部分:
- 调用栈(Call Stack) :JavaScript 是单线程的,它只有一个调用栈,用于存储执行上下文。当函数被调用时,会创建一个执行上下文并压入调用栈,当函数执行完毕后,会从调用栈中弹出。
- 任务队列(Task Queue) :当异步操作(如 setTimeout、Promise 等)完成时,会将对应的回调函数放入任务队列中等待执行。
- 微任务队列(Microtask Queue) :当 Promise 等微任务完成时,会将对应的回调函数放入微任务队列中等待执行。微任务队列的优先级高于任务队列,当调用栈为空时,会先执行微任务队列中的所有任务,然后再执行任务队列中的任务。
- 事件循环:事件循环的工作就是不断地检查调用栈是否为空,如果为空,就从任务队列中取出一个任务执行。在每个任务执行之间,会先执行微任务队列中的所有任务。
这就是 JavaScript 的事件循环的基本结构。通过这种机制,JavaScript 可以在单线程中实现非阻塞的异步操作。
在 JavaScript 的事件循环中,任务可以分为宏任务(MacroTask)和微任务(MicroTask)。
宏任务 包括:
setTimeoutsetIntervalsetImmediate(Node.js 环境)requestAnimationFrame- I/O 操作(Node.js 环境)
- UI 渲染(浏览器环境)
微任务 包括:
Promise.then或Promise.catchprocess.nextTick(Node.js 环境)MutationObserver(浏览器环境)
事件循环的执行顺序是:每次执行完一个宏任务后,会检查微任务队列,如果有微任务,就执行所有的微任务,然后再执行下一个宏任务。这就是为什么微任务的优先级高于宏任务,因为微任务总是在下一个宏任务开始前执行。