Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JavaScript 视觉化:Event-Loop

JavaScript 视觉化:Event-Loop

作者头像
前端黑板报
发布于 2022-12-01 09:20:56
发布于 2022-12-01 09:20:56
51400
代码可运行
举报
文章被收录于专栏:前端黑板报前端黑板报
运行总次数:0
代码可运行

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

哦,事件循环,是每个前端开发者都必须以某种方式处理的事情之一,但是一开始理解起来可能会感到疑惑。我是一个视觉学习者,所以我想通过低分辨率的 GIF 图片以视觉方式解释来尝试帮助你,因为现在都2019年,GIF 图片不知为何还是像素化和模糊的。

但是开始,应该知道什么是 Event-Loop 以及为何你应该关注它?

JavaScript 是单线程:同一时刻只能执行一个任务。通常情况下没什么大问题,但是现在假设你在执行一个耗时 30s 的任务。啊,在那个任务期间,我们需要等待 30s 才能执行其他任务(默认情况下,JavaScript 执行在浏览器的主线程上,所以整个 UI 会被卡住 )。😭现在都 2019 年了,没有人希望慢且没有响应的网站。

幸运的是,浏览器给了我们一些 JavaScript 引擎自身不提供的特性:Web 接口。这些包括 DOM 接口、setTimeout、HTTP 请求等等。这些特性可以帮助我们创建一些异步、非阻塞行为 🚀。

当我们调用一个方法时,它会被加入到一个叫做调用栈的里面。调用栈是 JavaScript 引擎的一部分,这与浏览器无关。它是一个栈意味着是先进后出(想起了一堆煎饼)。当一个函数返回值后,它就会被从栈顶抛出。

(gif 太大,看动图点击原文)

respond 函数返回一个 setTimeout 函数,setTimeout 是 Web 接口提供给我们的:它使我们能在不阻塞主线程的情况下延迟一些任务。我们传递给 setTimeout 的箭头函数 ()=>{return 'Hey'} 被加载到浏览器提供的 Web 接口中。同时,setTimeoutrespond 函数从栈中弹出,它们都返回了各自的值。

gif2.1

在 Web 接口中,计时器的将要运行的时间与我们传递给它的第二个参数一样长,即 1000ms。回调并不是直接添加到调用栈中而是被加到一个叫做队列的东西中。

gif3.1

这可能是令人迷惑的部分:1000ms 后它不是被添加到调用栈中,而是被添加到队列中。由于这是一个队列,这个函数必须等待轮到它时才能执行。

现在我们都在等待 Event loop 执行它的任务所需时间:连接队列与调用栈!若调用栈空了,意味着之前所有调用的函数已经返回它们各自的值而且从栈中被抛出,同时队列中的第一项会被加到调用栈中。在这种情况下,没有其它的函数调用,意味着当回调函数称为队列中的第一项时调用栈是空的。

gif4

回调函数被添加到调用栈中,执行以及返回值,最后从栈中抛出。

gif5

读文章是很有趣,但你只有通过反复实际操作才能完全适应。试着想一下,如果我们运行下面的程序,控制台中会打印什么记录。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const foo = () => console.log("First");
const bar = () => setTimeout(() => console.log("Second"), 500);
const baz = () => console.log("Third");

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

明白了吗?让我们快速看下当在浏览器中运行上面的代码发生了什么:

(gif 太大,看动图点击原文)

  1. 1. 我们调用 bar 函数,bar 返回一个 setTimeout 函数。
  2. 2. 我们传递给 setTimeout 的函数被添加到浏览器提供的 Web 接口中,setTimeoutbar 函数从栈中抛出。
  3. 3. 计时器运行的同时,调用 foo 函数并打印出 First,并返回 undefined ,调用 baz 函数。以及回调函数添加到队列中。
  4. 4. baz 打印 Third,在 baz 返回后 Event loop 的调用栈是空的,接着回调函数添加到调用栈中。
  5. 5. 回调函数打印出 Second

希望这能让你对 Event loop 更适应一些。不要担心,如果它仍然令人困惑,最重要的是了解某些错误/行为来自哪里,以便有效的搜索正确术语,并最终进入正确的 StackOverflow 页面。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-11-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端黑板报 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
编辑精选文章
换一批
动图学 JavaScript 之:事件循环(Event Loop)
今天该学习 Event Loop 啦,其实之前我写过一篇 Event Loop 的文章:
savokiss
2019/12/31
1K0
动图学 JavaScript 之:事件循环(Event Loop)
图解Javascript事件循环
JavaScript是单线程的:一次只能运行一个任务。 通常,这没什么大不了的,但是现在想象您正在运行一个耗时30秒的任务。
IT工作者
2022/01/21
7870
到底什么是Event Loop?那就来了解一下JavaScript分别在浏览器和Node环境下的运行机制吧
当时的我是一脸懵逼的,因为从来都没有听过这个专业名词。不过面试官还是很友好的,他说没关系,那你来做一道题,看看下面这段代码的执行结果是什么?
@零一
2021/01/29
7580
到底什么是Event Loop?那就来了解一下JavaScript分别在浏览器和Node环境下的运行机制吧
细谈 Event Loop
提起异步,相信每个人都知道。异步背后的“靠山”就是event loops。这里的异步准确的说应该叫浏览器的event loops或者说是javaScript运行环境的event loops,因为ECMAScript中没有event loops,event loops是在HTML Standard定义的。
用户1462769
2019/10/09
1.8K0
细谈 Event Loop
Event loop 及 macrotask & microtask
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://ligang.blog.csdn.net/article/details/98023768
奋飛
2019/08/15
5480
多图生动详解浏览器与Node环境下的Event Loop
当时的我是一脸懵逼的,因为从来都没有听过这个专业名词。不过面试官还是很友好的,他说没关系,那你来做一道题,看看下面这段代码的执行结果是什么?
程序员法医
2022/08/11
7110
多图生动详解浏览器与Node环境下的Event Loop
Event Loop 可视化解析讲解
原先,我们有一篇文章,简单描述了 JS (Event Loop)事件循环 和 (Call Stack) 调用堆栈。从宏观角度,分析浏览器中事件循环的运行机制。
前端柒八九
2022/08/25
5990
Event Loop 可视化解析讲解
JavaScript之Event Loop
先看段代码: console.log(1); setTimeout(function () { console.log(2); new Promise(function (resolve, reject) { console.log(3); resolve(); console.log(4); }).then(function () { console.log(5); }); }); function fn
laixiangran
2018/04/24
8290
JavaScript之Event Loop
深入理解Javascript单线程谈Event Loop
假如面试回答js的运行机制时,你可能说出这么一段话:“Javascript的事件分同步任务和异步任务,遇到同步任务就放在执行栈中执行,而碰到异步任务就放到任务队列之中,等到执行栈执行完毕之后再去执行任务队列之中的事件。”但你能说出背后的原因吗?
小周sir
2019/09/23
1.6K0
深入理解Javascript单线程谈Event Loop
【动画演示】:事件循环 形象深动(JavaScript)
JS 是单线程的:一次只能运行一个任务。通常这没什么大不了的,但现在想象一下我们正在运行一个需要30秒的任务。在这个任务中,我们要等待30秒,然后才能执行接下来要做的事情(JS 默认运行在浏览器的主线程上,所以整个UI都卡住了)。
前端小智@大迁世界
2022/06/15
1.1K0
【动画演示】:事件循环 形象深动(JavaScript)
javascript运行机制:并发模型 与Event Loop
版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/article/details/52199629
空空云
2018/09/27
7480
javascript运行机制:并发模型 与Event Loop
JavaScript 中的异步:Event Loop 及其他
简单地说,JavaScript 是单线程执行的语言,但在使用中有很多异步执行的情况。异步的本质是用其他方式(相对同步)控制程序的执行顺序,这与其他语言中的多线程模型不同,所以常常有人对非顺序 JavaScript 代码的运行结果感到困惑不解。
前端迷
2019/07/08
7290
结合Event Loop谈谈对Vue中nextTick的理解
(关于 Event Loop的细节,我写过一篇很详细的总结试图解释清楚Javascript Event Loop[1]。)
scarsu
2020/10/22
7230
结合Event Loop谈谈对Vue中nextTick的理解
JavaScript事件循环模型
JavaScript 事件循环模型是基于单线程的执行机制。它使用事件队列(Event Queue)和调用栈(Call Stack)来管理和执行任务。
堕落飞鸟
2023/05/18
4290
JavaScript的工作原理:引擎,运行时和调用堆栈的概述
随着 JavaScript 变得越来越流行,各团队正在多个领域栈中使用它们,其中包括 — 前端,后端,混合应用,嵌入式等等。
奋飛
2019/08/15
1.6K0
JavaScript 运行机制详解:再谈Event Loop
一年前,我写了一篇《什么是 Event Loop?》,谈了我对Event Loop的理解。 上个月,我偶然看到了Philip Roberts的演讲《Help, I'm stuck in an event-loop》。这才尴尬地发现,自己的理解是错的。我决定重写这个题目,详细、完整、正确地描述JavaScript引擎的内部运行机制。下面就是我的重写。 进入正文之前,插播一条消息。我的新书《ECMAScript 6入门》出版了(版权页,内页1,内页2),铜版纸全彩印刷,非常精美,还附有索引(当然价格也比同类书籍
ruanyf
2018/04/12
1.1K0
JavaScript 运行机制详解:再谈Event Loop
试图解释清楚【JavaScript Event Loop】
JS运行时包含了一个消息队列,每个消息队列关联着一个用于处理这个消息的回调函数。(队列的特点是先进先出)
scarsu
2020/10/22
6620
试图解释清楚【JavaScript Event Loop】
一文搞懂javascript事件循环原理?「前端每日一题v22.11.16」
了解javascript的第一步,就是要了解事件循环机制。但是要真正的了解javascript的事件循环机制并不容易,因为它是javascript引擎最基础的部分。它可以让单线程的javascript以非阻塞方式执行
FE情报局
2022/12/05
3050
一文搞懂javascript事件循环原理?「前端每日一题v22.11.16」
JavaScript——事件循环机制
JavaScript的任务分为两种同步和异步,它们的处理方式也各自不同,同步任务是直接放在主线程上排队依次执行,异步任务会放在任务队列中,若有多个异步任务则需要在任务队列中排队等待,任务队列类似于缓冲区,任务下一步会被移到调用栈然后主线程执行调用栈的任务。
思索
2024/08/16
1890
JavaScript——事件循环机制
你不知道的 Event Loop
笔者最近忙着做项目之类的,文章输出遗落下了一段时间,这次我们就来聊一个面试中一个比较重要的知识点 —— Event Loop
一只图雀
2020/04/07
9040
推荐阅读
相关推荐
动图学 JavaScript 之:事件循环(Event Loop)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验