我正在尝试按特定间隔将数字记录到控制台。但是,发生的事情是等待设置的时间间隔,然后照常注销所有内容。
我尝试了两种创建闭合的方法。但是对于延迟的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都将使用闭包提供的上下文进入事件队列。有什么作用?
答案 0 :(得分:2)
由于循环基本上是立即执行的,因此与第一个循环没有太大区别,因为时间以毫秒为单位,而对于第二个循环,它们都将在1秒后执行。
结合使用这两种方法,可以实现:
function timeOutLoop(x) {
for(var i = 0; i <= x; i++) {
setTimeout(function(num) {
return function(){
console.log(num);
}
}(i), i * 1000);
}
}
timeOutLoop(33)
答案 1 :(得分:2)
setTimeouts是同时启动的,因此,如果您想一次又一次地启动超时,则可以创建一个递归函数:
function timeOutLoop(x, i=0){
if(i<=x){
console.log(i);
i++;
setTimeout(function(){timeOutLoop(x, i)},1000);
}
}
timeOutLoop(33)
您可以将超时值设置为任意值。
答案 2 :(得分:1)
function timeOutLoop(x){
for(let i = 0; i<=x; i++){
setTimeout(function(){console.log(i)},i * 1000);
}
}
timeOutLoop(33);
这是您要找的东西吗?从var
更改为let
,以使变量i
在循环范围内保持不变。 More here about let vs var。
也将i
乘以1000,每秒打印一次,直到达到33。