首页 > web前端 > js教程 > 正文

深入理解JavaScript事件循环机制_javascript核心

夜晨
发布: 2025-11-12 23:44:02
原创
991人浏览过
JavaScript事件循环先执行同步代码,再清空微任务队列,最后执行宏任务;例如,Promise.then(微任务)在setTimeout(宏任务)前执行,因每次宏任务执行后需清空所有微任务。

深入理解javascript事件循环机制_javascript核心

JavaScript的事件循环机制是理解其异步编程模型的核心。很多人知道setTimeout、Promise、async/await能实现异步操作,但不清楚它们执行顺序背后的原理。关键就在于事件循环(Event Loop)如何协调调用、任务队列和微任务队列。

JavaScript单线程与异步的矛盾

JavaScript是一门单线程语言,意味着同一时间只能执行一个任务。如果遇到耗时操作(如网络请求、定时器),阻塞主线程会导致页面卡顿。为解决这个问题,JavaScript引入了事件循环机制,通过非阻塞方式处理异步任务

浏览器或Node.js环境提供了Web API(如DOM操作、setTimeout、fetch等),这些API在后台执行异步操作,完成后将回调函数推入任务队列,由事件循环决定何时执行。

宏任务与微任务:任务分类

事件循环中,任务分为两类:宏任务(Macro Task)和微任务(Micro Task)。它们的执行优先级不同,直接影响代码执行顺序。

立即学习Java免费学习笔记(深入)”;

常见宏任务包括:
  • 整体代码 script
  • setTimeout 回调
  • setInterval 回调
  • I/O 操作
  • UI 渲染
常见微任务包括:
  • Promise.then/catch/finally 回调
  • MutationObserver
  • queueMicrotask()
  • process.nextTick(Node.js)

每次事件循环迭代中,先执行当前调用栈中的同步代码,然后清空微任务队列(所有可用微任务),再取一个宏任务执行。这个过程不断重复。

执行顺序实例解析

看一个经典例子,理解宏任务与微任务的执行优先级:

文心大模型
文心大模型

百度飞桨-文心大模型 ERNIE 3.0 文本理解与创作

文心大模型 56
查看详情 文心大模型

console.log('start');
setTimeout(() => console.log('timeout'), 0);
Promise.resolve().then(() => console.log('promise'));
console.log('end');

输出顺序是:start → end → promise → timeout

原因如下:

  • “start” 是同步代码,立即输出
  • setTimeout 被放入宏任务队列
  • Promise.then 被放入微任务队列
  • “end” 是同步代码,立即输出
  • 同步代码执行完毕,事件循环检查微任务队列,执行 Promise 回调,输出 “promise”
  • 微任务清空后,取出一个宏任务(setTimeout),输出 “timeout”

事件循环完整流程

一次完整的事件循环大致经历以下步骤:

  • 执行全局脚本,同步任务入栈并执行
  • 遇到异步操作,交由 Web API 处理,完成后根据类型放入对应队列
  • 同步代码执行完毕,检查微任务队列,逐个执行直到清空
  • 从宏任务队列中取出一个任务执行
  • 执行过程中产生的微任务加入微任务队列,本轮循环末尾继续清空
  • 重复以上过程

注意:每个宏任务执行完后,都会清空当前所有的微任务,这是理解 async/await 行为的关键。

基本上就这些。掌握事件循环,你就明白了为什么Promise比setTimeout先执行,也就能写出更可靠的异步逻辑。不复杂但容易忽略细节。

以上就是深入理解JavaScript事件循环机制_javascript核心的详细内容,更多请关注php中文网其它相关文章!

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号