几张动图带你轻松回顾 event loop

news/2024/7/10 2:42:30 标签: js, javascript, html, vue, python
htmledit_views">
html" title=js>js_content">

今天要分享的内容是事件循环event loop

一个老生常谈的问题,之所以拿出来说,推荐的原因在于:

通过几张动图的形式,就把这个过程描述清楚了,太有趣了。

精力有限,图片并非本人制作,如有侵权,会删除滴~

为什么需要它

JavaScript是单线程的:一次只能运行一个任务。通常,这没什么大不了的,但是现在想象一下您正在运行一个耗时30秒的任务。在此任务中,我们等待30秒才能进行其他任何操作(默认情况下,JavaScript在浏览器的主线程上运行,因此整个用户界面都被卡住了)。

这样子的体验是不能接受的,你不能把时间花在这么一个迟钝的网站。

幸运的是,浏览器为我们提供了JavaScript引擎本身不提供的一些功能:Web API。这包括DOM API,setTimeout,HTTP请求等。这可以帮助我们创建一些异步的,非阻塞的行为。


初次见面

当我们调用一个函数时,它会被添加到一个叫做调用栈的东西中。调用堆栈是JS引擎的一部分,这与浏览器无关。它是一个堆栈,意味着它是先入后出的(想想一堆薄饼)。当一个函数返回一个值时,它被从堆栈中弹出。

流程图1

响应函数返回一个setTimeout函数。setTimeout是由Web API提供给我们的:它让我们在不阻塞主线程的情况下延迟任务。我们传递给setTimeout函数的回调函数,箭头函数()=> { return 'Hey' }被添加到Web API中。同时,setTimeout函数和response函数被从堆栈中弹出,它们都返回了它们的值!

流程图2

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

流程图3

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


揭开面纱

现在是我们一直在等待的部分,是时候让事件循环完成它唯一的任务了:将队列和调用栈连接起来。如果调用栈是空的,那么如果所有先前调用的函数都已经返回了它们的值,并且已经从栈中弹出,那么队列中的第一个项目就会被添加到调用栈中。在这种情况下,没有其他函数被调用,也就是说,当回调函数成为队列中的第一项时,调用栈是空的。

流程图4

回调被添加到调用堆栈,被调用,并返回一个值,然后被从堆栈中弹出,如图:

流程图5

跑个demo

其实我看完这些动图后,是很能理解作者思路滴,不过,我还是建议初学者,可以跑个例子看看,下面是一个不错的例子:

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

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

虽然看起来很简单,嗯,可以尝试搞一下:

打开我们的浏览器,跑一下上面的代码,让我们快速看一下在浏览器中运行此代码时发生的情况:

流程图6

最后

今天的分享,主要是用几张动图带回顾了下事件循环机制。


http://www.niftyadmin.cn/n/1251488.html

相关文章

php验证qq,php验证QQ邮箱是否有效

//POST HTTP请求,返回响应结果function post_request($url, $vars, ${$ch curl_init($url);curl_setopt($ch, CURLOPT_HEADER,0);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_POST, 1);if($vars){curl_setopt($ch, CURLOPT_POSTFIELDS,…

王力宏近照苍老异常,原来是……是写代码导致的

昨天看节目,发现这人声音很熟悉但一时间不知道这人是谁? 读书那会天天听他的音乐,想着有一天我和他一样那该多酷呀,十几年后我在某种程度上实现了;不是我在唱歌了,而是他也在写代码了,一个音乐人…

php都有哪些框架,php主流框架有哪些?

PHP作为网络开发的强大语言之一,现在应用非常广泛,具有开放源代码,跨平台性强,开发快捷,效率高,面向对象,并且易于上手,专业专注等诸多优点。各种PHP开发框架也让程序开发变的简单有效。对于Web…

值得私藏的几个优质公众号,拯救你面试烦恼

学习如逆水行舟,不进则退;只有坚持不断的学习,才能保持进步。今天给大家精心挑选的几个超高质量优质的公众号,在行业深耕已久,相信大家一定会有所收获。不多说,直接看介绍。????高级前端进阶这是我的好哥们木易杨&…

php perl,Perl与PHP之间有哪些区别?Perl与PHP的对比

Perl与PHP之间的区别是什么?下面本篇文章就来带大家了解一下Perl与PHP,介绍Perl与PHP之间的区别,希望对大家有所帮助。什么是Perl?Perl是一种动态的,高级的、通用的编程语言,它没有任何官方缩写。它是纯粹使…

一文帮你理清前端渲染方案!

01引言随着前端系统的越发复杂,前端的性能也受到越来越多的重视。Google也不断在推进新的性能相关指标,从原先的Performance API中的指标逐步演进成用户性能体验相关的指标。对于用户而言,First Paint、First Meaningful Paint和TTI这几个指标…

PHP2018版在哪些程序,2018年PHP程序员的进阶之路

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼第1阶段:初级PHP程序员重点:把LNMP搞熟练(核心是安装配置基本操作)目标:能够完成基本的LNMP环境安装,简单配置维护;能够做基本的简单系统的PHP开发;能够在PHP中…

写给前端新人 - 我 JS 写的好好的,为什么要用那么复杂的 TS

作者:Kaiser原文:https://juejin.cn/post/6953500339425247246前言我JS写的好好的,为啥要用TS写呢?本文写给那些完全没有用过TS,也没有使用过结构化语言,对TS有一定的心智负担的前端新手同学。面对铺天盖地…