事件循环是javascript实现异步非阻塞执行的调度机制,由调用栈、微任务队列和宏任务队列构成,执行顺序为:同步代码→清空微任务→执行一个宏任务→循环。

事件循环是 JavaScript 实现异步非阻塞执行的调度机制。它不是语言规范里的代码,而是一套运行时(浏览器或 Node.js)协调任务执行的规则:主线程只做一件事,做完就从队列里拿下一个任务来跑,如此反复。
它为什么存在?
因为 JavaScript 是单线程的——同一时间只能执行一段同步代码。如果遇到网络请求、定时器、用户点击这类耗时操作,总不能让整个页面卡住干等。所以 JS 把这些操作交给浏览器或系统底层去处理,自己先继续往下跑;等结果回来,再按轻重缓急排好队,一个一个执行回调。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
它靠哪几块拼起来?
✅ 调用栈:同步代码的执行现场。函数调用压栈,返回就出栈。栈空了,事件循环才开始“看队列”。
✅ 微任务队列:优先级最高,比如 Promise.then、queueMicrotask、MutationObserver。每次栈空后,它会被一次性清空(包括新产生的微任务也会插队进来)。
✅ 宏任务队列:优先级低一些,比如 setTimeout、setInterval、DOM 事件、I/O 回调。每次只取一个执行,执行完又回去清微任务。
它的执行节奏是怎样的?
每一轮循环严格遵循这个顺序:
- 先跑完当前所有同步代码(直到调用栈彻底清空)
- 立刻执行全部待处理的微任务(不中断、不跳过)
- 执行一个宏任务(比如某个 setTimeout 回调)
- 回到第一步,重复
这个节奏可以用口诀记住:同步 → 微任务(清空)→ 宏任务(一个)→ 循环
举个例子帮你盯住顺序
console.log(1)
setTimeout(() => console.log(2), 0)
Promise.resolve().then(() => console.log(3))
console.log(4)
输出是 1 → 4 → 3 → 2。
原因很直接:1 和 4 是同步,立刻打印;栈空后,Promise.then(微任务)马上执行,输出 3;最后才轮到 setTimeout 的回调(宏任务),输出 2。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










