2

图1

for (var i = Things.length - 1; i >= 0; i--) {
    setTimeout(function(){
        // do something with Things[i]
    }, 200 * i);
};

图 2

$(".things").each(function(i,o){
    setTimeout(function(){
        //do something with o
    }, 200 * i);
});

为什么图 2 有效,而图 1 无效?每次我尝试第一种方法时i总是等于-1。是什么赋予了?

4

2 回答 2

8
for (var i = Things.length - 1; i >= 0; i--) {
    (function(i){
        setTimeout(function(){
          // do something with Things[i]
        }, 200 * i);
    })(i)
};

您需要为 创建一个范围i,以便它保持其价值。否则它会随着循环更新。

它适用于图 2 ( $.each(function(i,o){...})) 的原因是因为这里的匿名函数正在为i.

于 2013-11-07T13:57:03.577 回答
1

@ahren 答案还可以。没有 IIF,我得到了类似的东西,这对某人来说可能更简单......

function loop(i) {
// do something with Things[i]
    if(--i>=0) {
        setTimeout(loop, 200*i, i);
    }
}

setTimeout(loop, 200*Things.length, Things.length);
于 2013-11-07T14:22:25.747 回答