js执行顺序

这篇具有很好参考价值的文章主要介绍了js执行顺序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.首先js是单线程的

所有的同步任务都是按顺序依次执行的,前面的执行完了之后才会执行后面的任务。遇到计算量大的代码就会阻塞在这里。下面的代码就是打印输出10000次,当循环走完了之后 才会走后面的代码,输出的时间是981ms

js执行顺序

输出981ms

js执行顺序

2.因为js是单线程的,所有的任务都需要按顺序执行,那如果我在执行过程中开启了一个定时器,定时器延迟10秒执行,后面的代码是不是要十秒之后才执行呢?

测试一下

js执行顺序

输出的结果表示:定时器后面的代码先执行了,而定时器里面的代码再10秒后执行了

js执行顺序

 这是为什么呢?

因为js虽然是单线程,但是我们并不需要所有的代码都要依次执行,避免一些不必要的阻塞。所以就引入了事件循环队列。引入了事件循环队列之后,就将js中所有的代码分成了两大类 ,一类是同步代码,另一类是异步代码。同步代码的执行顺序总是早于异步代码。 可以理解成,js从上到下依次执行,遇到同步的就直接执行,遇到异步的,就将异步的代码放到最后再执行。

下面代码的执行顺序是可以这样理解, 从上到下依次执行。先执行一号代码,是同步的,就直接输出。然后执行到二号代码,是个定时器,定时器是异步的,所以放到最后面再执行。然后执行三号代码,三号是同步的,直接输出。然后执行到四号代码,四号代码也是定时器,是异步的,所以放到最后(这个时候四号的异步代码是在二号的异步代码后面的)。然后执行到五号代码,直接输出。这个时候同步的代码已经全部执行完了,就开始执行刚刚放到最后面的二号代码和四号代码。

所以输出顺序是 同步1,同步2,同步3,异步1,异步2

js执行顺序

输出结果

 js执行顺序

 而实际上,就是将异步的代码放入任务队列中去,等同步的代码执行完了之后,然后再去执行任务队列里的任务。js执行顺序

 文章来源地址https://www.toymoban.com/news/detail-402229.html

 哪些任务会进入任务队列呢(异步任务有哪些)?

定时器,ajax异步请求,promise.then里的东西 等等

任务队列又分成两个,一个是宏任务队列,一个是微任务队列。微任务队列里的任务要优先于宏任务队列里的任务

宏任务:定时器等

微任务:promise.then()里的代码,promise是同步的,ajax异步请求等

js执行顺序

上面代码的执行顺序是(结合图一起看):

1.遇到了1号代码,是同步的,直接执行 输出1号,同步1。

2.遇到了二号代码,是个定时器,是宏任务,异步的。所以先不执行,放入宏任务队列

3.遇到三号代码的promise,是个微任务,先不执行,放入微任务队列

4.遇到5号代码,是同步的,直接执行 输出5号,同步2

js执行顺序

 

5.这个时候同步代码执行完了,然后去任务队列里找任务执行。任务队列里有两个队列,一个是宏任务队列,里面有个定时器。还有一个微任务队列,里面有个promse成功的回调。因为微任务执行顺序是先于宏任务的,所以会先执行promise里面的代码

6.执行promise里的代码,遇到三号代码了,是同步的 直接执行 输出3号,微任务1

7.继续向下执行 遇到4号的定时器了,4号定时器是异步的,并且是宏任务,所以先不执行,放入宏任务队列

js执行顺序

 

8.这个时候微任务队列里已经没有任务了,所以去执行宏任务队列里的任务。宏任务队列里先在有两个任务,一个是2号的定时器,一个是4号的定时器。

9.按顺序,先执行2号定时器里面的代码,里面的代码是同步的,直接执行 输出2号,宏任务1

js执行顺序

 

10.执行完宏任务里的第一个任务之后(2号定时器),看一下微任务队列里还有没有任务,   有的话就继续执行微任务队列里的任务,没有的话就继续执行下一个宏任务队列里的任务。

11.我们这里微任务队列已经没有其他任务了,所以继续执行宏任务队列里的任务。执行4号定时器,里面的代码是同步的,所以直接执行,输出 4号,promise里的定时器

js执行顺序

输出结果 

js执行顺序

 

 

 

到了这里,关于js执行顺序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C# 多线程交替按照指定顺序执行

    1.关于AutoResetEvent和ManualResetEvent的区别解释如下: AutoResetEvent和ManualResetEvent是.NET中的两个线程同步类。它们之间的主要区别在于其释放信号的方式以及对等待线程的影响。 AutoResetEvent的作用是在等待的线程被信号唤醒后,将信号自动重置为非终止状态。也就是说,当一个线程

    2024年02月11日
    浏览(26)
  • 【业务功能篇91】微服务-springcloud-多线程-线程池执行顺序

    1.1 继承Thread 1.2 实现Runnable接口 1.3 Callable接口   上面的三种获取线程的方法是直接获取,没有对线程做相关的管理,这时可以通过线程池来更加高效的管理线程对象。 然后我们就可以通过这个线程池对象来获取对应的线程   通过上面的介绍我们发现获取线程的方式 继承

    2024年02月10日
    浏览(44)
  • 如何保证三个线程按顺序执行?不会我教你

    👨‍🎓作者:bug菌 ✏️博客:CSDN、掘金、infoQ、51CTO等 🎉简介:CSDN|阿里云|华为云|51CTO等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,掘金 | InfoQ | 51CTO等社区优质创作者,全网粉丝合计 15w+   ;硬核微信公众号「猿圈奇妙屋」,欢迎你的

    2024年02月07日
    浏览(35)
  • js执行顺序

    1.首先js是单线程的 所有的同步任务都是按顺序依次执行的,前面的执行完了之后才会执行后面的任务。遇到计算量大的代码就会阻塞在这里。下面的代码就是打印输出10000次,当循环走完了之后 才会走后面的代码,输出的时间是981ms 输出981ms 2.因为js是单线程的,所有的任务

    2023年04月08日
    浏览(26)
  • js中如何顺序执行异步任务

    在js中,任务可分为两种,同步任务和异步任务。 (1) 同步任务 又叫 非耗时任务 ,指的是在主线程排队执行的那些任务 只有前一个任务执行完毕,才能执行后一个任务 (2) 异步任务 又叫 耗时任务 ,异步任务由JavaScript委托给宿主环境进行执行 当异步任务执行完成后,会通知

    2024年02月09日
    浏览(31)
  • 【昕宝爸爸小模块】如何让Java的线程池顺序执行任务

    ➡️博客首页       https://blog.csdn.net/Java_Yangxiaoyuan        欢迎优秀的你👍点赞、🗂️收藏、加❤️关注哦。        本文章CSDN首发,欢迎转载,要注明出处哦!        先感谢优秀的你能认真的看完本文,有问题欢迎评论区交流,都会认真回复! Java中的线程池

    2024年01月16日
    浏览(34)
  • JS执行机制--同步与异步

    单线程 JavaScript语言具有单线程的特点,同一个时间只能做一件事情。这是因为JavaScript脚本语言是为了处理页面中用户的交互,以及操作DOM而诞生的。如果对某个DOM元素进行添加和删除,不同同时进行。应该是先添加,再删除,事件有序。 单线程的特点是所有任务都需要排队

    2023年04月20日
    浏览(23)
  • 一文读懂异步和同步——async/await在运行时和普通代码的执行顺序的问题

    一、执行顺序问题 JavaScript中的await语句是异步编程中用于等待Promise对象执行结果的,它通常与async函数一起使用。在使用await时,程序的执行将暂停,直到该后面的Promise对象完成执行并返回结果。 函数代码执行顺序通常情况下按照代码所在文件从上至下

    2024年02月03日
    浏览(34)
  • kafka Consumer 消费者使用多线程并发执行,并保证顺序消费, 第一种使用纯线程方式、第二种使用Executors线程池

    网上搜索kafka消费者通过多线程进行顺序消费的内容都不太理想,或者太过复杂,所以自己写了几个demo,供大家参考指正。         单个消费者,每秒需要处理1000条数据,每条数据的处理时间为500ms,相同accNum(客户账号)的数据需要保证消费的顺序。 1、如果1秒钟生产

    2024年02月15日
    浏览(32)
  • 解决:js 根据图片链接(image url)下载,有的打开预览,有的下载

    1、问题描述 https://*****/drugTestReport/20230515/202305151106111386737.png https://*****/drugTestReport/20230605/202306051540314553141.jpg 同样结构的两个图片链接,使用window.open(url),一个是打开预览,另一个是下载   2、解决方法,通过fetch请求url,获取blob类型,区分情况,统一成下载。  

    2024年02月09日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包