Javascript:对于vs jQuery.each()有时间延迟

时间:2013-11-07 13:55:06

标签: javascript jquery

图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。是什么给了什么?

2 个答案:

答案 0 :(得分: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创建一个闭包。

答案 1 :(得分: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);