编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

可视化的 JS:动态图演示 - 事件循环 Event Loop的过程

wxchong 2024-07-26 22:51:42 开源技术 21 ℃ 0 评论


原文地址:https://dev.to/lydiahallie/javascript-visualized-event-loop-3dif

原文作者:Lydia Hallie

译者:夜尽天明

转发链接:https://mp.weixin.qq.com/s/uPgvp1wULIck2yKAqNLeLQ

前言

对于事件循环,这是每个 JavaScript 开发人员必然会遇到或者需要理解的内容之一。

但是对于初级开发者来说,理解起来可能有些混乱。

因为我是一个视觉学习者,所以我通过低分辨率 gif 图的可视化方式来帮助你理解它。

事件循环

但是首先,事件循环是什么,为什么要关心呢?

JavaScript 是 单线程的:一次只能运行一个任务。

通常,这没什么大不了的,但是现在想象你正在运行一个耗时 30 秒的任务。

在此任务中,我们等待 30 秒才能进行其他任何操作(默认情况下,JavaScript 在浏览器的主线程上运行,因此整个用户界面都停滞了) 。

都到 2020 年了,没有人想停留在一个速度慢,交互反应迟钝的网站。

幸运的是,浏览器为我们提供了JavaScript 引擎本身不提供的一些功能:Web API。

这包括 DOM API,setTimeout HTTP 请求等,这可以帮助我们创建一些异步的,非阻塞的行为。

当我们调用一个函数时,它会被添加到称为 调用栈 的数据结构中。

调用栈是 JS 引擎的一部分,这不是特定于浏览器的。

它是一个调用栈,这意味着它是 先进先出 的(例如一堆煎饼)。

当一个函数返回一个值时,它会从调用栈中弹出 。

该 respond 函数返回一个 setTimeout 函数。

在 setTimeout 由 Web API 提供给我们:它让我们拖延的任务,而不会阻塞主线程。

我们传递给该 setTimeout 函数的回调函数,箭头函数 () => { return "Hey" } 已添加到 Web API。

同时,该 setTimeout 函数和 response 函数从调用栈中弹出,它们都返回了它们的值!

在 Web API中,计时器的运行时间与我们传递给它的第二个参数 1000ms 一样长。回调不会立即添加到调用栈中,而是会传递给称为队列的东西。

这可能是一个令人困惑的部分:这并不意味着在 1000 毫秒后将回调函数添加到调用栈中(从而返回一个值)!它只是在 1000 毫秒后添加到 队列中。但这是一个队列,该功能必须等待轮到它!

接下来是我们一直在等待的重点内容……

让事件循环执行其唯一的任务了:将队列与调用栈连接起来!如果调用栈为 ,那么如果所有先前调用的函数都返回了它们的值并已从堆栈中弹出,则队列中的 第一项 将添加到调用栈中,在这种情况下,没有其他函数被调用,这意味着当回调函数成为队列中的第一项时,调用栈为空。

回调被添加到调用栈中,被调用,并返回一个值,并从调用栈中弹出。


例子

阅读一篇文章很有趣,但是通过反复的实际操作,你会对此理解得更深。

如果运行以下 js,请想一下控制台会输出什么内容:

const foo = () => console.log("First");
const bar = () => setTimeout(() => console.log("Second"), 500);
const baz = () => console.log("Third");

bar();
foo();
baz();

想出答案了吗?

让我们快速看一下在浏览器中运行此代码时发生的过程:


  1. 我们调用 bar,bar 返回一个 setTimeout 函数。
  2. 我们传递给的回调 setTimeout 被添加到 Web API,该 setTimeout 函数中,并 bar 从调用堆栈中弹出。
  3. 计时器运行,同时 foo 调用并记录 First,foo 返回(未定义),baz 被调用,并将回调添加到队列中。
  4. baz 输出 Third,事件循环看到 baz 返回后调用栈为空,然后将回调添加到调用栈。
  5. 回调再打印出 Second。

希望这会使你对事件循环的理解更加清晰!最重要的是 了解某些错误 / 行为可能从何而来

当遇到不明白的地方时,也能 高效地Google 上搜索正确的关键字 ,并能搜索到正确的答案 。

最后

外国友人技术博客的语言表达的方式和风格、与国人的还是有很大差别的啊。

姐妹篇:可视化的 js:动态图演示 Promises & Async/Await 的过程

翻译了两篇文章,还是蛮有趣的 ,瞬间感觉自己的英文水平高达 8 级了啦 (白日梦 )。

推荐JavaScript经典实例学习资料文章

教你如何用动态规划和贪心算法实现前端瀑布流布局「实践」

可视化的 js:动态图演示 Promises & Async/Await 的过程

原生JS封装拖动验证滑块你会吗?「实践」

如何实现高性能的在线 PDF 预览

细说使用字体库加密数据-仿58同城

Node.js要完了吗?

Pug 3.0.0正式发布,不再支持 Node.js 6/8

纯JS手写轮播图(代码逻辑清晰,通俗易懂)

JavaScript 20 年 中文版之创立标准

值得收藏的前端常用60余种工具方法「JS篇」

箭头函数和常规函数之间的 5 个区别

通过发布/订阅的设计模式搞懂 Node.js 核心模块 Events

「前端篇」不再为正则烦恼

「速围」Node.js V14.3.0 发布支持顶级 Await 和 REPL 增强功能

深入细品浏览器原理「流程图」

JavaScript 已进入第三个时代,未来将何去何从?

前端上传前预览文件 image、text、json、video、audio「实践」

深入细品 EventLoop 和浏览器渲染、帧动画、空闲回调的关系

推荐13个有用的JavaScript数组技巧「值得收藏」

前端必备基础知识:window.location 详解

不要再依赖CommonJS了

犀牛书作者:最该忘记的JavaScript特性

36个工作中常用的JavaScript函数片段「值得收藏」

Node + H5 实现大文件分片上传、断点续传

一文了解文件上传全过程(1.8w字深度解析)「前端进阶必备」

【实践总结】关于小程序挣脱枷锁实现批量上传

手把手教你前端的各种文件上传攻略和大文件断点续传

字节跳动面试官:请你实现一个大文件上传和断点续传

谈谈前端关于文件上传下载那些事【实践】

手把手教你如何编写一个前端图片压缩、方向纠正、预览、上传插件

最全的 JavaScript 模块化方案和工具

「前端进阶」JS中的内存管理

JavaScript正则深入以及10个非常有意思的正则实战

前端面试者经常忽视的一道JavaScript 面试题

一行JS代码实现一个简单的模板字符串替换「实践」

JS代码是如何被压缩的「前端高级进阶」

前端开发规范:命名规范、html规范、css规范、js规范

【规范篇】前端团队代码规范最佳实践

100个原生JavaScript代码片段知识点详细汇总【实践】

关于前端174道 JavaScript知识点汇总(一)

关于前端174道 JavaScript知识点汇总(二)

关于前端174道 JavaScript知识点汇总(三)

几个非常有意思的javascript知识点总结【实践】

都2020年了,你还不会JavaScript 装饰器?

JavaScript实现图片合成下载

70个JavaScript知识点详细总结(上)【实践】

70个JavaScript知识点详细总结(下)【实践】

开源了一个 JavaScript 版敏感词过滤库

送你 43 道 JavaScript 面试题

3个很棒的小众JavaScript库,你值得拥有

手把手教你深入巩固JavaScript知识体系【思维导图】

推荐7个很棒的JavaScript产品步骤引导库

Echa哥教你彻底弄懂 JavaScript 执行机制

一个合格的中级前端工程师需要掌握的 28 个 JavaScript 技巧

深入解析高频项目中运用到的知识点汇总【JS篇】

JavaScript 工具函数大全【新】

从JavaScript中看设计模式(总结)

身份证号码的正则表达式及验证详解(JavaScript,Regex)

浏览器中实现JavaScript计时器的4种创新方式

Three.js 动效方案

手把手教你常用的59个JS类方法

127个常用的JS代码片段,每段代码花30秒就能看懂-【上】

深入浅出讲解 js 深拷贝 vs 浅拷贝

手把手教你JS开发H5游戏【消灭星星】

深入浅出讲解JS中this/apply/call/bind巧妙用法【实践】

手把手教你全方位解读JS中this真正含义【实践】

书到用时方恨少,一大波JS开发工具函数来了

干货满满!如何优雅简洁地实现时钟翻牌器(支持JS/Vue/React)

手把手教你JS 异步编程六种方案【实践】

让你减少加班的15条高效JS技巧知识点汇总【实践】

手把手教你JS开发H5游戏【黄金矿工】

手把手教你JS实现监控浏览器上下左右滚动

JS 经典实例知识点整理汇总【实践】

2.6万字JS干货分享,带你领略前端魅力【基础篇】

2.6万字JS干货分享,带你领略前端魅力【实践篇】

简单几步让你的 JS 写得更漂亮

恭喜你获得治疗JS this的详细药方

谈谈前端关于文件上传下载那些事【实践】

面试中教你绕过关于 JavaScript 作用域的 5 个坑

Jquery插件(常用的插件库)

【JS】如何防止重复发送ajax请求

JavaScript+Canvas实现自定义画板

Continuation 在 JS 中的应用「前端篇」


原文地址:https://dev.to/lydiahallie/javascript-visualized-event-loop-3dif

原文作者:Lydia Hallie

译者:夜尽天明

转发链接:https://mp.weixin.qq.com/s/uPgvp1wULIck2yKAqNLeLQ

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表