惊艳!可视化的js:动态图演示-事件循环EventLoop

惊艳!可视化的js:动态图演示-事件循环EventLoop

2023年6月30日发(作者:)

惊艳!可视化的js:动态图演⽰-事件循环EventLoop原⽂作者:Lydia Hallie译者:夜尽天明前⾔对于事件循环,这是每个 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 = () => ("First");const bar = () => setTimeout(() => ("Second"), 500);const baz = () => ("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 上搜索正确的关键字 ,并能搜索到正确的答案 。最后外国友⼈技术博客的语⾔表达的⽅式和风格、与国⼈的还是有很⼤差别的啊。姐妹篇:翻译了两篇⽂章,还是蛮有趣的 ,瞬间感觉⾃⼰的英⽂⽔平⾼达 8 级了啦 (⽩⽇梦 )。 推荐阅读:1.

2.

1.

2.

3. ⽀持⼀下下

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1688107667a82616.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信