for + setTimeout

10まで を数える。

for(var i = 1; i <= 10; i++) {
    setTimeout(function() {
        print(i);
    }, i * 1000);
}

いっけん間違ってなさそうだけど 11 しか表示されない。タイムアウト後はすでにループを抜けて i は 11 になってるため。

for(var i = 1; i <= 10; i++) {
    setTimeout((function(i) {
        return function() {
            print(i)
        }
    })(i), i * 1000)
}

これで OK.
タイムアウトがセットされた時点で外側の function は評価されて、タイムアウト後に返された function を実行てことかな。


http://la.ma.la/misc/userjs/amazon_gift.user.js より。


setTimeoutの第一引数は Function でなければならないことも重要。