Javascript 如何在for循环中使用setInterval函数
我正在尝试运行多个计时器,给出一个可变的项目列表。代码如下所示:Javascript 如何在for循环中使用setInterval函数,javascript,for-loop,closures,setinterval,Javascript,For Loop,Closures,Setinterval,我正在尝试运行多个计时器,给出一个可变的项目列表。代码如下所示: var list = Array(...); for(var x in list){ setInterval(function(){ list[x] += 10; console.log(x + "=>" + list[x] + "\n"); }, 5 * 1000); } 上述代码的问题在于,唯一更新的值是列表末尾的项目乘以列表中的项目数 有谁能提供一个解决方案和一些解释
var list = Array(...);
for(var x in list){
setInterval(function(){
list[x] += 10;
console.log(x + "=>" + list[x] + "\n");
}, 5 * 1000);
}
上述代码的问题在于,唯一更新的值是列表末尾的项目乘以列表中的项目数
有谁能提供一个解决方案和一些解释,让我知道它为什么会这样吗?所以,有几件事:
setInterval()
的回调函数维护对x
的引用,而不是在每个特定迭代过程中存在的x
的快照值。因此,当x
在循环中更改时,它也会在每个回调函数中更新setTimout()
提供附加参数,可以将参数传递给回调函数:
var timeoutID=window.setTimeout(func,delay,[param1,param2,…)代码>
数字将按值传递,而不是按引用传递。下面是一个例子:
var列表=[1,2,3,4];
对于(变量x=0,ln=list.length;x%d”,y,list[y]+=10);
},x*500,x);//我们经过了x
}
var列表=[1,2,3,4,5];
对于(变量i=0,len=list.length;i”+列表[i]+“\n”);
}, 5000)
})(i) );
}
您不必在setInterval
语句中使用for循环。试试这个:
var list = Array(...);
var x = 0;
setInterval(function() {
if (x < list.length;) {
list[x] += 10;
console.log(x+"=>"+list[x]);
}
else return;
x++;
}, 5000);
var list=Array(…);
var x=0;
setInterval(函数(){
if(x”+列表[x]);
}
否则返回;
x++;
}, 5000);
如果包含JSON数组和jQuery,则可以使用:
$.each(jsonArray, function(i, obj) {
setInterval( function() {
console.log(i+' '+obj);
}, 10);
});
我不知道如何使用for循环执行此操作,但这里的代码将以定时间隔打印出数组中的每个元素:
function displayText(str) {
$('.demo').append($('<div>').text(str));
}
var i = 0;
var a = [12, 3, 45, 6, 7, 10];
function timedLoop() {
setTimeout(function () {
displayText(a[i]);
i++;
if(i < a.length) {
timedLoop();
}
}, 2000)
}
timedLoop();
函数显示文本(str){
$('.demo').append($('.text(str));
}
var i=0;
VarA=[12,3,45,6,7,10];
函数timedLoop(){
setTimeout(函数(){
显示文本(a[i]);
i++;
如果(i
使用一点jquery在浏览器中显示它 您可以将forEach
和setTimeout
组合在一起,以间隔在数组上循环
let模式=[1,2,3,4,5,6,7,8,9,10];
设间隔=1000//一秒钟
模式。forEach((模式,索引)=>{
设置超时(()=>{
console.log(模式)
},索引*间隔)
})
是的,我建议您阅读这篇文章:。然而,最重要的是,循环中的setTimeout可能不是他想要做的事情,因为所有回调都将在同一时间触发,它们不会交错。OP不需要“闭包”,相反,它需要避免对x的闭包(你的答案实际上是这样的)。它保持关闭列表虽然。优秀的解决方案!一个小提示:任何可以在循环中更改的内容都可以传递给匿名函数,而不仅仅是索引。
function displayText(str) {
$('.demo').append($('<div>').text(str));
}
var i = 0;
var a = [12, 3, 45, 6, 7, 10];
function timedLoop() {
setTimeout(function () {
displayText(a[i]);
i++;
if(i < a.length) {
timedLoop();
}
}, 2000)
}
timedLoop();