javascript - 關於setTimeout執行時間問題
滿天的星座
滿天的星座 2017-06-14 10:54:39
0
2
792

A

    for (var i=5; i>=1; i--) { 
          setTimeout( function timer() {
              document.write(i+"<br />");
          }, i*3000 );
    }
    // 0 0 0 0 0
    // 保存执行后,3秒后弹出第一个console(0),之后隔3秒弹出第二个,依次按照时间执行。

A2

    for (var i=1; i<6; i++) { 
          setTimeout( function timer() {
                console.log(i);
          }, i*3000 );
    }
    // 6 6 6 6 6
    // 保存执行后,3秒后弹出第一个console(6),之后每隔3秒弹出一个,依次按照时间执行。

B

    for (var i=5; i>=1; i--) { 
          setTimeout( function timer() {
              document.write(i+"<br />");
          }, 3000 );
    }
    // 0 0 0 0 0 
    // 保存执行后,3秒后所有的console一齐弹出
    

C(採用閉包)

    for (var i=5; i>0; i--) { 
          !function (num) {
              setTimeout( function timer() {
                console.log(num);
              }, i*3000 );
          }(i)
    }
   // 1 2 3 4 5 每隔3秒依次弹出

問題:

1. A與A2中的時間設定中的i*3000i值為多少? (1?),為什麼時間依舊是3000,沒有和i值一齊計算? 包含採用閉包後(C),依舊是每隔3000ms彈出。

2. A與B的差別? i*30003000console彈出的差異,這個差異在C閉包上也有體現。為什麼會造成這樣區別?

之前看到JS的佇列執行結構,知道setTimeout這類函數是須等其他程式碼執行完畢後才開始執行,且存在多個setTimeout的話,按照時間設定長短,分配優先權(設定時間短的在前)。這裡實在不知道為什麼會有這樣的差別,對它還是摸不透- -

for (var i=1;i<6;i++) { 
      !function (num) {
          setTimeout( function timer() {
            console.log(num);
          }, num*3000 );
      }(i)
}

依舊是每隔3秒彈出一個console,去掉num*則一齊彈出。相乘運算難道沒執行?

滿天的星座
滿天的星座

全部回覆(2)
学霸
  1. setTimeout每隔3000ms彈出一個的話,時間不應該是3000,6000,9000,12000嗎,你是不是跟setInterval搞混了。
    接著再說一點setTimeout(fn,time),這是個函數的執行,setTimeout的創建與主js是同步的(這個時候time的值就已經確定了),異步的是其中的fn的執行(執行的時候再去找內部的inum才會收閉包等的影響)。

  2. 站內搜尋event loop js應該有很多重複的問題和解釋。

左手右手慢动作

setTimeout的延遲是相對於你運行它的那一刻,你這個for循環一股腦的把延遲全部設定好了,第一個相對當前3秒,第二個相對當前是6秒,第三個是9秒……以此類推。最後體現出來不就是每隔3秒一個輸出嗎…

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板