2016-05-25 99 views
0

我试图启动几个setInterval函数“一次”。 我有一个for循环调用索引函数,它包含setInterval。javascript setInterval函数内循环不工作

我找的答案都在这里: JavaScript closure inside loops – simple practical example 这里: setInterval with loop time

,但我仍然没有成功...挣扎

我检查了标签,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](); 
} 
+1

你的'//某些动作'是否依赖变量'i'? – Luka

+0

是的,这些动作取决于变量我 –

+0

你正在传递一个函数给'setinterval',它需要一个参数'i',但是'setInterval'没有传入参数给它的回调函数,所以'i'将是未定义的。 –

回答

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); 
+0

它似乎工作,感谢很多 –

+0

它可能听起来很愚蠢,但我无法清除这些倍数setInterval与称为我调用那些setInterval函数的相同方式的函数... –

+1

添加了一个示例清除计时器。 –

0

我建议你使用全局变量countDownAction,你可以试试下面来代替。

window.countDownAction = window.countDownAction || [];