callback in for()

by yasumodev

HTML

<h3>forの中でコールバックが発生する例</h3>
悪い例
<br><textarea id="log1" cols="10" rows="2"></textarea>
<hr>
良い例1
<br><textarea id="log2" cols="10" rows="2"></textarea>
<hr>
良い例2
<br><textarea id="log3" cols="10" rows="2"></textarea>

JavaScript

// 外部処理(Web接続、DB接続など想定)
function external(callback) {
    setTimeout(callback, 1000);
}
// テスト用配列
var abc = ["a","b","c"];

// 悪い例
for(var i in abc) {
    // コールバックが発生する処理
    external(function() {
        document.getElementById("log1").value += abc[i];
    });
}

// 良い例1:ループ変数を受け取る関数でラップする
for(var i in abc) {
    wrap(i);
    function wrap(n) {
        // コールバックが発生する処理
        external(function() {
            document.getElementById("log2").value += abc[n];
        });
    }
}

// 良い例2:ループ変数を受け取る無名関数でラップする
for(var i in abc) {
    (function(n) {
        // コールバックが発生する処理
        external(function() {
            document.getElementById("log3").value += abc[n];
        });
    })(i);
}