type
status
date
slug
tags
category
icon
password

JavaScript 中的 Event Loop(事件循环)

JavaScript 是一门单线程语言,它的代码执行机制看起来像是“从上往下依次执行”,但其实背后有一套精巧的事件循环(Event Loop)机制,用来处理同步任务异步任务的调度执行。

一、JS 是如何执行代码的?

1. 执行流程整体分为三步:

  1. 同步任务 直接进入「执行栈(Call Stack)」,立刻执行。
  1. 异步任务(如 setTimeout、Promise)先交给浏览器或 Node 的底层处理,并把它们的回调函数注册起来
  1. 当前所有同步任务执行完后,JavaScript 引擎会进入「事件循环机制」,开始处理这些异步回调。

二、什么是同步任务?什么是异步任务?

类型
描述
示例
同步任务
立即执行的代码,按顺序
console.log(),函数调用等
异步任务
不立即执行,稍后执行
setTimeoutPromise.then

三、事件循环(Event Loop)到底怎么运作(面试回答这段话即可)?

可以把 JavaScript 的运行比作一个生产线,主线程专门处理任务,但它不能一口气做完所有事,有些任务需要排队慢慢处理。
事件循环的执行步骤如下:
  1. 先执行所有同步代码,这些代码会放到 执行栈(Call Stack) 中逐个运行。
  1. 执行过程中遇到异步代码,例如定时器、Promise 等,会交给浏览器或 Node 环境的 异步 API 来处理,回调函数会被“登记”。
  1. 一旦同步代码全部执行完,执行栈清空,JavaScript 引擎就开始运行 事件循环(Event Loop)
  1. 事件循环会先查看「微任务队列(MicroTask Queue)」,把里面的任务一个个加入执行栈并执行。
  1. 微任务执行完后,再去取「宏任务队列(MacroTask Queue)」中的下一个任务,执行对应的回调。
  1. 每完成一个宏任务,就再检查一次微任务队列,清空它,如此循环往复。

四、可视化理解


五、简单例子:一眼看懂执行顺序

输出顺序:
解释:
  • startend 是同步任务,直接执行。
  • Promise.then(...) 是微任务,在当前宏任务结束后立即执行。
  • setTimeout(...) 是宏任务,排到下一轮事件循环。
 
webPack分包代码==和===
Loading...