[英]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.