使用闭包在循环中创建的javascript计时器或间隔

pha*_*zei 9 javascript closures loops timer setinterval

我正在使用jQuery在几个元素上设置定时器或间隔循环,以便每隔几秒检查一次.我已经尝试设置一个计时器并检查我是否应该重新启动它,或者设置和间隔并检查是否应该停止它.

虽然简化了,但基本上我需要的是:

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]);
    }
}
Run Code Online (Sandbox Code Playgroud)

类项目的ID是id_1,id_2,id_3.但我只得到3个提醒id_3.在我的代码中,我开始尝试传递'this',但一直在简化它以找出问题.

我怎样才能让它每次都将变量复制到一个新地址?我知道我需要使用闭包.它似乎是在引用其他var var mater是什么.

我尝试将它简化为一个带有定时器的循环:

function tester(item) {
    return function() {
        alert(item);
    };
}
for(x=1;x<=3;x++) {
    setTimeout( '(function() { tester(x) })(x)' , 3000);
}
Run Code Online (Sandbox Code Playgroud)

但我认为我只是让我的问题变得更糟,而且似乎没有做任何事情.

我已经搜索过以前的问题,但大多数都填充了大量的额外代码,而不是削减特定的问题,并以其他方式解决.通过让这个例子有效,我想了解这是如何工作的.在写这篇文章的过程中,我确实设法了解我可以通过帮助功能来启动计时器.

function tester(item)
    alert(item);
function myTimer(item)
    setInterval( function() { tester(item); }, 3000);
for(x=1;x<=3;x++)
    myTimer(item);
Run Code Online (Sandbox Code Playgroud)

没有这个怎么办呢?有更好的方法吗?

And*_*rle 3

当你使用each时,你就处于闭包中,你只是忘记了var使你的变量在函数作用域中私有化

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]);
    }
}
Run Code Online (Sandbox Code Playgroud)