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常に equals になり-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 に答える