Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用闭包在循环中创建的javascript计时器或间隔_Javascript_Loops_Timer_Closures_Setinterval - Fatal编程技术网

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

使用闭包在循环中创建的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

我使用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]);
    }
}
类项目的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 );
        }
    }
};