2014-10-04 67 views
-1

這裏是我的代碼的setTimeout()無法正常工作

(function() { 
    (function DeleteREG(i) { 
     setTimeout(function() { 
      if (i > 0) { 
       setTimeout(function stop_() { 
        alert(i); 
       }, 2000); 
       setTimeout(function() { 
        i--; 
        DeleteREG(i); 
       }, 800); 
      } 
     }, 4000); 
    })(5); 
})(); 

根據它的代碼應該在i=5,4,3,2,1提醒。但它提醒在i=4,3,2,1,0。可誰能請解釋我爲什麼不工作?應該是什麼整流後的代碼能夠正常工作?同樣的事情發生了下面的代碼也

(function() { 
    (function DeleteREG(i) { 
     setTimeout(function() { 
      if (i > 0) { 
       setTimeout(function stop_() { 
        alert(i); 
       }, 2000); 

        i--; 
        DeleteREG(i); 
      } 
     }, 4000); 
    })(5); 
})(); 

並請解釋我以書面format.How解決擺脫這個問題的?

+0

第二個超時將在第一個超時之前運行,所以'i'在調用'alert'之前遞減。 – MarcoL 2014-10-04 17:07:05

回答

0

當您致電setTimeout時,您的代碼不會停止。

這裏定義這兩個函數:

  setTimeout(function stop_() { 
       alert(i); 
      }, 2000); 
      setTimeout(function() { 
       i--; 
       DeleteREG(i); 
      }, 800); 

他們同一時刻後調用2000800毫秒。這就是爲什麼i--出現在第一個回調的alert之前。

A「溶液」可能是鏈中的第那些回調的在第二個:

(function() { 
    (function DeleteREG(i) { 
     setTimeout(function() { 
      if (i > 0) { 
       setTimeout(function stop_() { 
        console.log(i); 
        setTimeout(function() { 
         i--; 
         DeleteREG(i); 
        }, 80); 
       }, 200); 

      } 
     }, 400); 
    })(5); 
})(); 
+0

謝謝您的回覆。您可否寫下修改後的代碼? – Satya 2014-10-04 17:17:38

+0

非常感謝。 – Satya 2014-10-04 17:37:17

+0

是否有任何書籍或網站會教我所有關於此事的內容?實際上,我對這種語言是陌生的。因此,您能否爲此推薦一些書籍或網站?請回復。如果我有一些問題,如果我想與您聯繫懷疑,那我怎麼聯繫你? – Satya 2014-10-04 17:42:28

0

傳遞給在相同的執行範圍被創建2個setTimeout S上的函數(一個執行範圍是在執行某個函數時創建的),這就是爲什麼他們共享相同的i變量。第二個回調將在第一個回調之前觸發,因此會更改i變量。

setTimeout x毫秒後將消息推入消息隊列中,x是您作爲第二個參數傳遞的時間。無論如何,傳遞給setTimeout的回調將始終在當前堆棧結束後運行。即使您通過0毫秒,也會發生這種情況(請閱讀更多詳情here)。

更新:我不知道什麼是你想實現的,但如果你想數從5到1,這會怎麼做:如果你沒有使用限制的選項

var delay = 1000; 

function doStuff (i) { 
    if (i > 0) { 
     alert(i); 

     i -= 1; 
     setTimeout(function() { 
      doStuff(i); 
     }, delay); 
    } 
} 
doStuff(5); 
+0

非常感謝你的解釋。很好。 – Satya 2014-10-04 17:40:37

+0

沒問題,請按照我提供的鏈接。它將幫助您更好地理解事件循環機制,這是使用JS時需要掌握的基本概念之一。令人遺憾的是,大多數人不費心學習這門語言,最終他們終於看到了令人困惑的代碼。 – 2014-10-04 18:05:00

+0

好的,我一定會關注那個鏈接。謝謝 – Satya 2014-10-04 18:25:38

0

離店在鉻上。它可以模擬慢速設備,改變時間間隔。