函數中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是有一個計時線程控制的,它會把這個計時器加到執行環境中最后一個執行。所以這個輸出結果就理所當然了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM