函数中setTimeout的执行顺序

这里先给出一段代码:

function a(){
  setTimeout(function(){
    console.log("setTimeout")
  },2000);
  function oneSecond(){
    var now = new Date();
    var exitTime = now.getTime() + 1000;
    while (true) {
      now = new Date();
      if (now.getTime() >= exitTime){
        console.log("oneSecond")
        return;
      }
    }
  }
  oneSecond();
  function twoSecond(){
    var now = new Date();
    var exitTime = now.getTime() + 2000;
    while (true) {
      now = new Date();
      if (now.getTime() >= exitTime){
        console.log("twoSecond")
        return;
      }
    }
  }
  twoSecond();
  function threeSecond(){
    var now = new Date();
    var exitTime = now.getTime() + 3000;
    while (true) {
      now = new Date();
      if (now.getTime() >= exitTime){
        console.log("threeSecond")
        return;
      }
    }
  }
  threeSecond();
}
a();

代码解释:调用函数a,首先执行setTimeout-两秒后执行,函数onesecond执行一秒,函数twosecond执行两秒,函数threesecond执行三秒。

请问控制台输出的顺序是什么???

这是一道面试题,当时我回答的输出顺序是onesecond---twosecond---settimeout---threesecond

我的根据是:js引擎是单线程的,执行函数a,settimeout进入执行队列,两秒后执行,这是onesecond,twosecond,threesecond进入js线程执行队列中,onesecond执行完后还没有轮到settimeout,但twosecond需要执行两秒,所以等待twosecond执行完后,settimeout才能开始执行,执行完后才执行。

但在浏览器中输出的结果却不是这样的,顺序为onesecond---twosecondt---threesecond---settimeout。

这是一个意外的结果,所以我给出了我新的理解,就是一个执行环境中,settimeout是有一个计时线程控制的,它会把这个计时器加到执行环境中最后一个执行。所以这个输出结果就理所当然了。

 

转载于:https://www.cnblogs.com/outside/p/3725436.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值