如果您想避免 setInterval 并将调用绑定到列表的长度,您可以创建一个自执行函数来保存当前索引,而不是使用闭包中的索引。闭包中的变量最终将始终是每个循环中的最后一个元素,因为循环将在读取 setTimeout 函数中的变量之前很久就完成。
您还调用了 clearTimeout 函数,在这种情况下,这对我来说没有多大意义。
最重要的是,您的所有 setTimeouts 将几乎同时被调用。这将导致所有值在屏幕上以毫秒间隔闪烁(或者在某些情况下太快而无法看到)。循环在这里并不合适,因为 setTimeout 函数是异步的。回调系统最适合有限数量的运行,而 setInterval 系统最适合未知数量的运行。对我来说,你的运行次数应该是你的 jQuery 对象中的元素数量(那些当前正在通过你的 $.each() 的元素)
我建议您对您的问题执行以下一般化示例(一般化,因为我无权访问您的 dom)。
function showMessage(message){
$('body').html(message);
}
var itemData = [1,2,3,4];
var i = 0;
function idTimer(list, i) {
if (!(i >= 0)) {
i= 0;
}
setTimeout((function(msg){
i++;
return function(){
if(i < list.length){
idTimer(list, i);
}
showMessage(msg);
}
})(list[i]), 1000);
}
idTimer(itemData);
可以在以下位置找到此代码的现场演示:http: //jsbin.com/ifuqo