簡體   English   中英

forTime中setTimeOut中的異常行為

[英]Unexpected behavior in setTimeOut in for loop

我正在嘗試按特定間隔將數字記錄到控制台。 但是,發生的事情是等待設置的時間間隔,然后照常注銷所有內容。

我嘗試了兩種不同的方式來創建閉合的方法。 但是對於延遲的console.log則不執行任何操作。

 function timeOutLoop(x){ for(var i = 0; i<=x; i++){ (function(n){ setTimeout(function(){console.log(n)},5000) })(i) setTimeout(function(num){ return function(){ console.log(num) } }(i),1000) } } timeOutLoop(33) 

我的印象是,每個setTimeout都將使用閉包提供的上下文進入事件隊列。 是什么賦予了?

由於循環基本上是立即執行的,因此與第一個循環沒有太大區別,因為時間以毫秒為單位,而對於第二個循環,它們都將在1秒后執行。

結合使用這兩種方法,可以實現:

  function timeOutLoop(x) { for(var i = 0; i <= x; i++) { setTimeout(function(num) { return function(){ console.log(num); } }(i), i * 1000); } } timeOutLoop(33) 

setTimeouts在同一時間啟動,因此如果您要一次又一次啟動超時,則可以創建一個遞歸函數:

function timeOutLoop(x, i=0){
   if(i<=x){
      console.log(i);
      i++;
      setTimeout(function(){timeOutLoop(x, i)},1000);
   }
}
timeOutLoop(33)

您可以將超時值設置為任意值。

 function timeOutLoop(x){ for(let i = 0; i<=x; i++){ setTimeout(function(){console.log(i)},i * 1000); } } timeOutLoop(33); 

這是你想要的? var更改為let ,以使變量i在循環范圍內保持完整。 有關let vs var的更多信息

還要將i乘以1000以每秒打印一次,直到達到33。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM