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
    评论
JavaScript 代码执行顺序可以分为以下几个阶段: 1. 解析阶段:JavaScript 引擎会先对代码进行解析,生成执行上下文和变量环境。 2. 创建阶段:在执行代码之前,JavaScript 引擎会先创建变量和函数的声明,这个过程叫做变量提升。 3. 执行阶段:JavaScript 引擎会按照代码书写的顺序执行代码,包括赋值操作、函数调用和表达式计算等。 下面是五道面试题以及讲解: 1. ```javascript console.log(a); var a = 1; ``` 输出结果是 `undefined`。 原因是变量 `a` 在执行之前会进行变量提升,在执行时相当于: ```javascript var a; console.log(a); a = 1; ``` 所以 `console.log(a)` 输出的是 `undefined`。 2. ```javascript var a = 1; function test() { console.log(a); var a = 2; } test(); ``` 输出结果是 `undefined`。 原因是在函数 `test` 内部,变量 `a` 发生了变量提升,在执行时相当于: ```javascript function test() { var a; console.log(a); a = 2; } ``` 所以 `console.log(a)` 输出的是 `undefined`。 3. ```javascript console.log(typeof x); ``` 输出结果是 `undefined`。 原因是变量 `x` 没有声明,所以在执行时会抛出错误,但是由于使用了 `typeof` 运算符,所以不会抛出错误,而是返回 `undefined`。 4. ```javascript var a = 1; function test() { a = 2; console.log(a); var a = 3; } test(); console.log(a); ``` 输出结果是 `2` 和 `1`。 原因是在函数 `test` 内部,变量 `a` 发生了变量提升,在执行时相当于: ```javascript function test() { var a; a = 2; console.log(a); a = 3; } ``` 所以 `console.log(a)` 输出的是 `2`,在函数外部的 `console.log(a)` 输出的是 `1`。 5. ```javascript var a = {}; var b = { key: 'b' }; var c = { key: 'c' }; a[b] = 123; a[c] = 456; console.log(a[b]); ``` 输出结果是 `456`。 原因是对象属性名在内部是通过字符串形式存储的,所以变量 `b` 和 `c` 在转换成字符串后是一样的,相当于: ```javascript a['[object Object]'] = 123; a['[object Object]'] = 456; ``` 所以 `console.log(a[b])` 输出的是 `456`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Xie_bro777

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

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

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

打赏作者

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

抵扣说明:

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

余额充值