javascript setInterval函数内部循环不起作用

时间:2016-05-25 18:05:28

标签: javascript loops setinterval

我试图立即启动几个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]();
}

3 个答案:

答案 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);
};