JavaScript事件循环案例深入理解

server/2024/12/23 16:20:55/

事件循环的主要步骤:

执行栈(Call Stack):
同步代码直接进入栈中依次执行。
任务队列(Task Queue):
异步任务(如 setTimeout、DOM 事件、Ajax 回调)完成后将其回调函数放入队列,等待被主线程处理。
微任务队列(Microtask Queue):
微任务(如 Promise 的 then 回调)优先于任务队列执行。
事件循环(Event Loop):
每次循环从栈中取出同步代码执行。
如果栈为空,则检查微任务队列,执行其中所有任务。
微任务完成后,处理任务队列中的任务。

上案例

console.log('Start');
function foo() {console.log("Inside foo");
} 
function bar() {foo();console.log("Inside bar");
} 
setTimeout(() => {console.log('Timeout');
}, 0);Promise.resolve().then(() => {console.log('Promise');
});
bar();console.log('End');

案例分析

分析任务分类

同步任务(立即执行):
console.log(‘Start’);:同步任务,立即输出。
bar();:同步任务,调用后执行 foo() 和 console.log(‘Inside bar’);。
console.log(‘End’);:同步任务,立即输出。
微任务(优先于宏任务):
Promise.resolve().then(…):创建了一个微任务,将回调 () => { console.log(‘Promise’); } 放入 微任务队列。
宏任务:
setTimeout(…):创建了一个宏任务,将回调 () => { console.log(‘Timeout’); } 放入 宏任务队列。

执行过程

同步代码先执行,微任务队列的任务优先执行,然后再处理宏任务队列。

执行同步任务
console.log(‘Start’)
输出:Start
(同步代码,立即执行)
bar()
进入 bar():
foo()
进入 foo():
console.log(“Inside foo”)
输出:Inside foo
(同步代码,立即执行)
foo() 执行完毕,返回。
console.log(“Inside bar”)
输出:Inside bar
(同步代码,立即执行)
bar() 执行完毕,返回。
console.log(‘End’)
输出:End
(同步代码,立即执行)
执行微任务队列
Promise.resolve().then(…)
回调 () => { console.log(‘Promise’); } 执行:
输出:Promise
(微任务优先于宏任务)
执行宏任务队列
setTimeout(…)
回调 () => { console.log(‘Timeout’); } 执行:
输出:Timeout
(宏任务最后执行)

最终输出结果

Start
Inside foo
Inside bar
End
Promise
Timeout

关于事件循环的疑问:

事件循环的提到了执行栈,可栈不是先进的后出吗?如果把同步代码依次放到栈里面,不应该代码顺序会颠倒过来吗

调用栈的工作原理

调用栈是一个按需管理的栈结构,同步代码的执行过程是:压入栈,执行完毕,弹出栈。这遵循了 JavaScript 的单线程运行机制。

以下是调用栈在执行同步代码时的逐步行为:

遇到代码行时,会将该行的执行上下文压入栈中。
执行上下文完成(执行完这行代码),对应的栈帧就从栈中弹出。
重复上述过程,代码顺序因此得以保持。


http://www.ppmy.cn/server/152533.html

相关文章

VSCode 插件开发实战(三):插件配置项自定义设置

前言 作为一名前端开发者,您可能已经在 VSCode 中体验过各种强大的插件。那么,如果您希望创建一个属于自己的插件,并且希望用户能够通过自定义配置进行灵活调整,该如何实现呢?本文将详细介绍如何在 VSCode 插件中实现…

jmeter怎么调用python

jmeter中使用python脚本 在jmeter中使用python脚本,搜了下,找到三种方式: 1、使用Jython包 下载 Download Jython 2.7.0 - Standalone Jar 包,放到jmeter/lib/目录下,重启jmeter,就能在sampler中找到JSR…

【SH】在Ubuntu Server 24中基于Python Web应用的Flask Web开发(实现POST请求)学习笔记

文章目录 Flask开发环境搭建保持Flask运行Debug调试 路由和视图可变路由 请求和响应获取请求信息Request属性响应状态码常见状态码CookieSession 表单GET请求POST请求 Flask 在用户使用浏览器访问网页的过程中,浏览器首先会发送一个请求到服务器,服务器…

第十四届蓝桥杯Scratch国赛真题—转动的车轮

转动的车轮 编程实现: 转动的车轮(车轮使用画笔绘制,画面中不能出现其他角色,否则0分)。 注:角色、背景非源素材。 具体要求: 1). 点击绿旗,背景如图所示; 2). 等待1…

【系统架构设计师】真题论文: 论软件设计方法及其应用(包括解题思路和素材)

更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 真题题目(2019年 试题1)解题思路论文素材参考软件设计方法概述和使用场景项目案例-结构化设计方法真题题目(2019年 试题1) 软件设计(Software Design,SD)根据软件需求规格说明书设计软件系统的整体结构、划…

电脑连接不上手机热点 找不到到服务器的ip地址

手机热点连接不上 找不到到服务器的ip地址 emmm希望不会有人不会吧 解决方法: 1.点击右上角图标进入设置 2.点击更改所有wifi网络的DNS设置 3.查看自己的IP分配和DNS分配是不是DHCP自动分配,不是的话就不对了,需要点击编辑手动改一下 4.改完…

第二十六周机器学习笔记:PINN求正反解求PDE文献阅读——正问题

第二十六周周报 摘要Abstract文献阅读《Physics-informed neural networks: A deep learning framework for solving forward and inverse problems involving nonlinear partial differential equations》1. 引言2. 问题的设置3.偏微分方程的数据驱动解3.1 连续时间模型3.1.1 …

MMAudio - 自动给视频配音效

MMAudio 在给定视频和/或文本输入的情况下生成同步音频。我们的关键创新是多模式联合训练,它允许对广泛的视听和音频文本数据集进行训练。此外,同步模块将生成的音频与视频帧对齐。 419 Stars 26 Forks 2 Issues NA 贡献者 MIT License Python 语言 代码…