js代码输出顺序

js代码输出顺序,涉及到:

    console.log();

    async…await;

    setTimeout();

    Promise().then()

最近面试做到的一个题目,感觉很有意思,拿来分享一波!!!!

完整代码附赠:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>代码执行顺序</title>
</head>
<body>
  <script>
    console.log("1");
    async function async1(){
      await async2();
      console.log('2');
    }  
    async function async2(){
      console.log('3');
    }  
    async1();
    setTimeout(function(){
      console.log("4")
    },0)//=>默认会有最小的等待时间(V8一般是5~6MS)
    new Promise(
      function(resolve,reject){
        console.log("5");
        resolve();
    }).then(function(){
      console.log("6")
    }).then(function(){
      console.log("7")
    })
    console.log("8")
  </script>
</body>
</html>

执行结果:
在这里插入图片描述

理智分析一波:

js是单线程的,在执行代码的过程中,先是自上而下执行,
(1)第一个输出语句console.log(“1”);直接输出“1”;
(2)第二个是async…await;表明async1依赖于async2;当async1()调用时,先执行async2,输出“3”;将微任务async1放入微任务队列,然后往下执行。
(3)第三个是一个定时器setTimeout();虽然它的执行时间看上去是0,但这是一个宏任务,先加入到宏任务队列中;
(4)第四个是Promise();最后执行的是resolve();说明成功了,同步执行内部的代码,输出“5”;将.then之后东西加入到微任务队列中;
(5)最后在执行一个console.log(“8”);直接执行,输出“8”;

此时整个代码同步执行完成,开始执行微任务队列中的async1以及promise.then()(为了方便,我们叫它p1);再执行宏任务队列中的定时器setTimeout();
(6)队列先进先出的原则,先执行async1,输出“2”;
(7)再执行p1,输出“6”;将后面的.then(为了方便,我们叫它p2)再次加入到微任务队列中;
(8)再执行p2,输出“7”;
(9)此时微任务队列执行完毕,执行宏任务队列中setTimeout();输出“4”; 整个代码全部执行完毕。

JS中的同步异步编程,宏任务与微任务的执行顺序,这里有一篇不错的博文,可以阅读阅读:
https://www.cnblogs.com/jiajialove/p/11978644.html
    对于宏任务-微任务、同步-异步的理解尚浅,如有什么不对的地方,请及时指出,
 万分感谢!!! 
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xie_bro777

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值