JavaScript事件循环通过调用栈、宏任务队列和微任务队列协同实现异步非阻塞,宏任务后必清空微任务队列,故Promise.then总比setTimeout先执行。

JavaScript 事件循环是运行时处理异步操作的核心机制,它决定了代码何时执行、按什么顺序执行。它不是 JavaScript 引擎的“额外功能”,而是单线程模型下实现非阻塞行为的关键设计——没有它,setTimeout、fetch、click 等异步任务就无法在不卡死页面的情况下工作。
JavaScript 运行在单线程环境中,但通过“调用栈 + 任务队列 + 事件循环”协同工作:
因为它们进入不同队列,且事件循环有明确优先级:一个宏任务结束后,必须先执行完所有排队的微任务,才去取下一个宏任务。看这个例子:
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 进入微任务队列;setTimeout 进入宏任务队列;事件循环在第一轮宏任务(脚本本身)结束后,立刻处理微任务(输出 3),之后才轮到第二轮宏任务(输出 2)。
立即学习“Java免费学习笔记(深入)”;
可以借助 queueMicrotask 和 setTimeout 的执行顺序来探测:
queueMicrotask(() => console.log('micro'));
setTimeout(() => console.log('macro'), 0);
// 总是 micro 先于 macro 打印
也可以用 Performance.now() 结合多次测量,观察回调的实际延迟是否符合预期——尤其在网络请求或动画帧场景中,能帮你判断是不是被长任务拖住了。
基本上就这些。事件循环不复杂,但容易忽略它对执行时机的严格约束。理解宏任务与微任务的分离,就能预判异步代码的真实顺序,写出响应及时、不易出错的逻辑。
以上就是什么是javascript事件循环_它如何影响代码执行?的详细内容,更多请关注php中文网其它相关文章!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号