摸清JS的代码执行顺序对于写代码很重要

首先,JS是单线程的。所以代码的执行是有自己的执行顺序。
如:                  var a = "1",b = "2",c = "3"; 
                          console.log(c);
                          console.log(b);
                          console.log(a);

                          //打印在控制台的顺序是  3 2 1
假如是这样的例子呢?
                          var d = "4";
                          new Promise(function(reslove,reject){
                                  console.log("我是promise1啊");
                                  setTimeout(function(){
                                       reslove();
                                  },1000)
                          }).then(function(){
                                  console.log("我是promise1的成功的回调啊");    
                          })
                          setTimeout(function(){
                                console.log("我是计时器1啊");
                          })
                          setTimeout(function(){
                                console.log("我是计时器2啊");
                          },1000)
                          new Promise(function(reslove,reject){
                                  console.log("我是promise2啊");
                                  reject(); 
                          }) .then(function(){
                                  console.log("我是promise2的成功回调啊");
                          }).catch(function(){
                                  console.log("我是promise2的失败的回调啊");  
                          }) 
                          console.log(d);

                          这时整个打印代码的执行顺序是什么样子的呢?
                          把代码放在浏览器的console里面去执行可以发现顺序是这样的。
                          /*
                            我是promise1啊
                            我是promise2啊
                            4
                            我是promise2的失败的回调啊
                            我是计时器1啊
                            我是promise1的成功的回调啊
                            我是计时器2啊

                          */
如果你答对了执行顺序,除了猜对的,说明你对执行顺序是很了解的,那可以跳过本文章。如果是猜对的或者是错了。可以往下读。帮你理清执行顺序!
                            这里要引入几个概念
                            

 

这里可以看出来任务的执行栈的执行方式是先主线程执行同步任务,主线程完成之后是异步任务。
而宏任务跟微任务是相对于广义的同步,异步执行的更精细化的定义
整个代码从宏任务进入主线程。
new Promise()是promise实例化会被直接执行所以先打印的是 我是promise1啊
然后执行到内部的setTimeout会放置到异步里面的宏任务的Event Queue      
then的方法会放置在微任务里面等待状态返回调用
继续走就遇到计时器1跟计时器2两个计时器同样被放置到宏任务的Event Queue 
之后是第一个new Promise()直接执行打印 我是promise2啊
相应的then跟catch统统放到微任务里面去。所以继续执行console.log(d),这是打印 4
第一个宏任务的主线程执行完毕。接着执行微任务
但是第一个promise的then并没有状态返回被调用所以没有执行,而第二个promise有reject的调用而被执行,
所以,打印出     我是promise2的失败的回调啊
微任务暂时执行结束,继续执行宏任务的 Event Queue。计时器先执行计时器1   打印  我是计时器1啊
然后执行同样被延迟1S但是先放入的第一个new promise里面的settimeout 然后执行已经在微任务里面等待的成功的回调所以执行   我是promise1的成功的回调啊
最后执行计时器2完成  打印 我是计时器2啊

 
                         

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值