我试图立即启动几个setInterval函数""。 我有一个for循环,它调用一个索引的函数,它包含setInterval。
我在这里寻找答案: JavaScript closure inside loops – simple practical example 和这里: setInterval with loop time
但我仍然没有成功地挣扎......
我已经选中了tab和tab2,如果我在setInterval函数之外的console.log中读取它们,则两者都有效
这是我的代码:
var tab = <?php echo json_encode($matrice); ?>;
var tab2 = new Array();
var funcs = [];
var countDownAction = new Array();
function countDown(i)
{
countDownAction[i] = setInterval(function(i)
{
// some actions
}, 1000);
}
for(var i = 0; i < tab.length; i++)
{
tab2[i] = [];
tab2[i]['hours'] = tab[i]['hours'];
tab2[i]['minutes'] = tab[i]['minutes'];
tab2[i]['seconds'] = tab[i]['seconds'];
funcs[i] = countDown.bind(this, i);
}
for(var j = 0; j < tab.length; j++)
{
funcs[j]();
}
答案 0 :(得分:2)
调用setInterval
内的函数时不带任何参数。因此,函数体内的i
将是未定义的。
考虑重写countDown
函数,如下所示:
function countDown(i)
{
countDownAction[i] = setInterval(function()
{
// some actions
}, 1000);
}
这样,函数体可以访问外部作用域中的i
。
要清除计时器,比如3.5秒后,您可以执行以下操作:
setTimeout(function () {
for (var k = 0; k < tab.length; k++) {
clearInterval(countDownAction[k]);
}
}, 3500);
答案 1 :(得分:0)
我建议您对countDownAction使用全局变量,可以尝试以下方法。
window.countDownAction = window.countDownAction || [];
答案 2 :(得分:0)
问题在于循环是如此之快,因此setInterval函数获取i变量的最后一个值。 我们需要使用这样的外部函数直接在间隔中设置i值:
var interval_Array = new Array();
for(var i; i<= number ;i++){
var newinterval = (i+1) * 1000; //Place any process according to your time
external_function(i,newinterval);
};
function external_function(this_i,this_interval){
interval_Array[i]=setInterval(function(){
//your script that contains i variable
},this_interval);
};