信息发布→ 登录 注册 退出

javascript如何运行_它如何通过事件循环处理异步任务

发布时间:2025-12-21

点击量:

JavaScript 是单线程语言,靠事件循环(Event Loop)协调同步与异步任务,实现非阻塞运行。

JavaScript 如何运行:从调用栈开始

代码执行时,函数调用被压入**调用栈(Call Stack)**,遵循后进先出原则。同步代码立即执行,栈空则当前任务完成。

例如:console.log("A"); setTimeout(() => console.log("B"), 0); console.log("C"); 会先输出 A、C,B 稍后才出现——因为 setTimeout 的回调不进调用栈,而是交给 Web API 暂存。

事件循环如何调度异步任务

事件循环持续监听两个关键队列:

  • 宏任务队列(Macrotask Queue):包含 setTimeoutsetIntervalI/OUI 渲染 等任务
  • 微任务队列(Microtask Queue):包含 Promise.then/catch/finallyqueueMicrotask()MutationObserver

每次宏任务执行完,事件循环会清空整个微任务队列,再取下一个宏任务——这就是 Promise 回调总比 setTimeout 先执行的原因。

一个典型执行顺序示例

运行以下代码:

console.log(1);
setTimeout(() => console.log(2), 0);
Promise.resolve().then(() => console.log(3));
console.log(4);

输出为:1 → 4 → 3 → 2。逻辑是:

  • 1 和 4 是同步代码,进调用栈立即执行
  • setTimeout 回调进入宏任务队列
  • Promise.then 进入微任务队列
  • 同步代码执行完毕,调用栈为空 → 事件循环处理微任务(输出 3)→ 再取宏任务(输出 2)

注意:Node.js 与浏览器略有差异

Node.js 的事件循环有更细的阶段划分(如 timers、pending callbacks、poll、check、close callbacks),process.nextTick() 的优先级甚至高于 Promise 微任务;而浏览器中 Promise 始终是最高等级微任务。实际开发中,应以 微任务 这一基本原则为准,避免跨环境强依赖执行时序。

标签:# javascript  # java  # js  # node.js  # node  # 浏览器  # mac  #   # 异步任务  
在线客服
服务热线

服务热线

4008888355

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!