type
status
date
slug
tags
category
icon
password
JavaScript 中的 Event Loop(事件循环)
JavaScript 是一门单线程语言,它的代码执行机制看起来像是“从上往下依次执行”,但其实背后有一套精巧的事件循环(Event Loop)机制,用来处理同步任务和异步任务的调度执行。
一、JS 是如何执行代码的?
1. 执行流程整体分为三步:
- 同步任务 直接进入「执行栈(Call Stack)」,立刻执行。
- 异步任务(如 setTimeout、Promise)先交给浏览器或 Node 的底层处理,并把它们的回调函数注册起来。
- 当前所有同步任务执行完后,JavaScript 引擎会进入「事件循环机制」,开始处理这些异步回调。
二、什么是同步任务?什么是异步任务?
类型 | 描述 | 示例 |
同步任务 | 立即执行的代码,按顺序 | console.log() ,函数调用等 |
异步任务 | 不立即执行,稍后执行 | setTimeout 、Promise.then 等 |
三、事件循环(Event Loop)到底怎么运作(面试回答这段话即可)?
可以把 JavaScript 的运行比作一个生产线,主线程专门处理任务,但它不能一口气做完所有事,有些任务需要排队慢慢处理。
事件循环的执行步骤如下:
- 先执行所有同步代码,这些代码会放到 执行栈(Call Stack) 中逐个运行。
- 执行过程中遇到异步代码,例如定时器、Promise 等,会交给浏览器或 Node 环境的 异步 API 来处理,回调函数会被“登记”。
- 一旦同步代码全部执行完,执行栈清空,JavaScript 引擎就开始运行 事件循环(Event Loop)。
- 事件循环会先查看「微任务队列(MicroTask Queue)」,把里面的任务一个个加入执行栈并执行。
- 微任务执行完后,再去取「宏任务队列(MacroTask Queue)」中的下一个任务,执行对应的回调。
- 每完成一个宏任务,就再检查一次微任务队列,清空它,如此循环往复。
四、可视化理解
五、简单例子:一眼看懂执行顺序
输出顺序:
解释:
start
和end
是同步任务,直接执行。
Promise.then(...)
是微任务,在当前宏任务结束后立即执行。
setTimeout(...)
是宏任务,排到下一轮事件循环。
- 作者:CC
- 链接:https://juejin.cn/user/1086748304878360/article/20942600-9788-803c-8106-c025f524e725
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。