JavaScript单线程和任务队列是什么

本文章是对以往“JavaScript单线程任务队列什么”知识点的总结与梳理,不仅内容丰富、详细,而且知识点逻辑十分清晰。相信多数人读完本文后,会对“JavaScript单线程和任务队列是什么”的知识内容,有更为深入的理解和认识。

一、JavaScript为什么设计为单线程?

JavaScript语言的一大特点就是单线程,换言之就是同一个时间只能做一件事。

for(var j = 0; j < 5; j++) { console.log(j);}console.log('end');

上面的代码,只有for循环执行完毕,才会执行end;

JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途就是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。

假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?

所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征,将来也不会改变。

为了利用多核CPU的计算能力,HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。所以,这个新标准并没有改变JavaScript单线程的本质。

二、任务队列

“任务队列”是一个事件的队列(也可以理解成消息的队列),IO设备完成一项任务,就在”任务队列”中添加一个事件,表示相关的异步任务可以进入”执行栈”了。主线程读取”任务队列”,就是读取里面有哪些事件;

我们来解释一下:

Javascript是单线程的,单线程就意味着所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。

如果排队是因为计算量太大,CPU占用高倒也情有可原,但是很多时候CPU是处于空闲状态或者有很大的空间未被使用,因为IO设备(输入输出设备)很慢(比如Ajax操作从网络读取数据),只能等结果出来,才可以往下执行。

JavaScript语言的设计者意识到,主线程完全可以不管IO设备,把这些等待中的任务挂起,先运行排在后面的任务。等到IO设备返回了结果,再去执行挂起的任务。

因此,所有任务可以分成两种,一种是同步任务(synchronous),另一种是异步任务(asynchronous)。

同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;

异步任务指的是,不进入主线程、而进入”任务队列”(task queue)的任务,只有”任务队列”通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。

具体来说,异步执行的运行机制如下。(同步执行也是如此,因为它可以被视为没有异步任务的异步执行。)

所有同步任务都在主线程上执行,形成一个执行栈

主线程之外,还存在一个”任务队列”(task queue)。只要异步任务有了运行结果,就在”任务队列”之中放置一个事件。

一旦”执行栈”中的所有同步任务执行完毕,系统就会读取”任务队列”,看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。

主线程不断重复执行上面的第三步。

for(var j = 0; j < 5; j++) {  console.log(j);  setTimeout(function() {    console.log('timeout');  }, 0);}console.log('end');

//结果0 1 2 3 4 end timeout timeout timeout timeout timeout

本文有关“JavaScript单线程和任务队列是什么”的介绍就到这里,如果您已经掌握上述知识,那就赶紧行动实操一下!如果还需要了解更多“JavaScript单线程和任务队列是什么”相关内容,可点击进入Worktile网站相关频道,进行搜索与查询。

文章标题:JavaScript单线程和任务队列是什么,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/14806

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云的头像亿速云认证作者
上一篇 2022年6月27日
下一篇 2022年6月27日

相关推荐

  • windows打印机出现0x000006b9如何解决

    解决方法: 方法一: 1、首先我们按下键盘“win+r”,然后输入“services.msc”回车确定打开服务列表。 2、然后在其中找到“windows firewall”服务,右键选中点击“启动” 3、开启之后,我们进入“控制面板” 4、接着在其中找到并进入“查看设备和打印机” 5、然后在其中找到…

    2022年9月15日
    63600
  • 加密在网络上有哪些作用

    加密在网络上的作用就是防止有用或私有化信息在网络上被拦截和窃取。加密后的口令即使被黑客获得也是不可读的,加密后的标书没有收件人的私钥也就无法解开,标书成为一大堆无任何实际意义的乱码,这样即使被盗也不会有损失;所以加密对于保护文件是相当的重要。 本教程操作环境:windows7系统、Dell G3电脑…

    2022年9月13日
    58400
  • word页码从第二页开始为1怎么设置

    word页码从第二页开始为1设置的方法: 1、首先点击名列前茅页的页尾。 2、然后选择任务选项栏中的“布局”。 3、随后点击“分隔符”选择分节符下方的“下一页”。 4、随后到要进行设置的第二页页尾并选中页码。 5、点击上方的“链接到前一节”将其取消。 6、随后回到名列前茅页的页码,选中并将其删除。 …

    2022年9月22日
    4.7K00
  • WAF对WebShell流量检测的性能分析是怎样的

    本地环境组建 从保留的截图来看,对方的php版本是5.6.40,所以我要搭一个apache+php5.6.40的测试环境。打开virtualbox,链接复制出来一份centos镜像系统,按照以下流程配置一遍。 1. 安装apache yum install -y httpdhttpd -vServe…

    2022年9月24日
    72600
  • 如何进行bee-box LDAP注入的靶场练习

    如果说sql注入的本质是拼接字符串的话,那么一切可以注入的本质都是拼接字符串,LDAP注入作为注入的一种也不例外,更有趣一点的说它是在拼接圆括号(sql注入也拼接圆括号,但是更习惯性的是说它拼接字符串)。 在环境配置篇里面已经很详细的说了bee-box中ldap环境的配置,靶场练习篇更多的是php与…

    2022年9月18日
    82600
  • mathtype下载了用不了如何解决

    mathtype下载了用不了解决方法 1、首先确保我们下载的mathtype是可以使用的,如果不能确定,建议在本站重新下一个。 2、下载安装完成之后,如果还是用不了,打开word点击“文件” 3、选择左下角“选项” 4、进入“信任中心”,点击“信任中心设置” 5、将office的“startup”文…

    2022年9月15日
    44100
  • mysql默认编码怎么看

    mysql中的默认编码是latin1(ISO_8859_1),可以使用“SHOW VARIABLES LIKE ‘character%’;”命令来进行查看。latin1编码是单字节编码,向下兼容ASCII,但不支持中文,可以通过在配置文件“my.ini”中查找并设置“defa…

    2022年9月19日
    92100
  • idaPro如何分析app解密lua脚本

    通过前面idaPro调试或hook,我们可以获取到xxtea解密key,对于sign我们可以直接打开原文件: 可以看到sign值:byds。所以,我们可以同过xxtea解密工具(可从GitHub上下源码自己编译)试着解密: 以index.luac为例,我们看index.luac解密前后变化: 我们看…

    2022年9月21日
    83200
  • 电脑出现0x0000007b如何解决

    解决方法: 方法一: 1、很可能是更新了错误的显卡驱动,出现错误代码后先重启电脑。 2、随后按下“F8”进入安全模式选择界面,选择“最近一次的正确配置”就能进入系统了。 3、这样可以解决应用程序冲突问题,如果无法解决,那么可以尝试更改硬盘启动模式。 方法二: 1、首先重启电脑,然后使用热键进入bio…

    2022年9月18日
    64500
  • potplayer播放视频没有声音如何解决

    potplayer播放视频没有声音的详细教程解决方法: 1、打开potplayer安装程序,然后选择【简体中文】,点击【OK】。 2、然后就是点击【下一步】,点击【我接受】。 3、在组件界面中,在【关联】下面,勾选上【关联所有格式】,其它的就随便了,然后点击【下一步】。 4、然后选择好位置以后,点击…

    2022年9月1日
    2.2K00
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部