使用闭包在循环中创建的javascript计时器或间隔
我使用jQuery在一些元素上设置一个计时器或间隔循环,以便每隔几秒钟检查一次。我试着设置一个计时器并检查是否应该重新启动它,或者设置一个时间间隔并检查是否应该停止它 虽然简化了,但这基本上是我需要的:使用闭包在循环中创建的javascript计时器或间隔,javascript,loops,timer,closures,setinterval,Javascript,Loops,Timer,Closures,Setinterval,我使用jQuery在一些元素上设置一个计时器或间隔循环,以便每隔几秒钟检查一次。我试着设置一个计时器并检查是否应该重新启动它,或者设置一个时间间隔并检查是否应该停止它 虽然简化了,但这基本上是我需要的: var mytimers = new Array(); $('div.items').each(function() { myID = $(this).attr('id'); mytimers[myID] = setInterval( function() { myFunctio
var mytimers = new Array();
$('div.items').each(function() {
myID = $(this).attr('id');
mytimers[myID] = setInterval( function() { myFunction(myID) } , 3000)
});
function myFunction(param) {
alert(param);
if (something()) {
clearInterval(mytimers[param]);
}
}
类项目的ID为ID_1、ID_2、ID_3。但我只收到3个警报,所有警报都给出id_3。在我的代码中,我开始尝试传递“this”,但不断简化它以找出问题所在
如何让它每次都将变量复制到新地址?我知道我需要使用闭包。无论发生什么,它似乎都在引用另一个变量
我试着用计时器将其简化为一个循环,如下所示:
function tester(item) {
return function() {
alert(item);
};
}
for(x=1;x<=3;x++) {
setTimeout( '(function() { tester(x) })(x)' , 3000);
}
功能测试仪(项目){
返回函数(){
警报(项目);
};
}
对于(x=1;x将变量“myID”作为匿名函数的局部变量
var myID = $(this).attr('id');
当您使用每一个变量时,您都处于一个闭包中,您只是忘记了将变量设置为函数作用域中的私有变量
var mytimers = new Array();
$('div.items').each(function() {
**var** myID = $(this).attr('id');
mytimers[myID] = setInterval( function() { myFunction(myID) } , 3000)
});
function myFunction(param) {
alert(param);
if (something()) {
clearInterval(mytimers[param]);
}
}
那么您想每三秒对每个匹配的元素运行myFunction
试试这个:
$('div.items').each( myFunction(this) );
var myFunction = function(elem) {
return function() {
if ( something(elem) ) {
//return or do something with elem
} else {
window.setTimeout( myFunction(elem), 3000 );
}
}
};
如果满足了something()
中的条件,则完成操作,否则函数会安排自己在3秒钟内使用与以前相同的元素再次运行。您可以在不同的元素上多次调用此函数,每次调用都有自己的元素
我更喜欢传递像elem这样的对象,并将其内部工作延迟到最后一刻。让something()
担心id或其他问题
使用关联数组(而不是new array()
您可以只使用{}
)或clearInterval
或ID)的其他练习都是不必要的
为了实际解决您的解决方案,正如Marimuthu所说,您将var
从myID
的声明中去掉,这意味着它是全局的,每次迭代都会被覆盖。结果是当setInterval
调用myFunction
而不是通过闭包获得唯一的本地myID
时,您会得到global一个已经被覆盖了很多次的变量。你真的应该用var
声明所有的局部变量,包括循环索引。我实际上在各种地方都尝试过var,除了那一个,哈。
$('div.items').each( myFunction(this) );
var myFunction = function(elem) {
return function() {
if ( something(elem) ) {
//return or do something with elem
} else {
window.setTimeout( myFunction(elem), 3000 );
}
}
};