forループでAPI関数(コールバックを受け取る)を複数回呼び出しています。私のコールバックは、インデックス固有の何かを行う必要があります。willCallBack関数(APIの一部)を変更できず、グローバル変数の作成を避けたいです。
次のスニペットは問題を示しています。最初のforループは私の最初の試みでしたが、すべてのコールバックに対してi==4を返します。2番目のforループは機能しますが、醜く、「ハックっぽい」と感じます
'i'の値をコールバック関数定義に取り込むためのよりクリーンな方法は何ですか?
var result = '', result2 = '';
// doesn't work; i == 4 for all
for(var i=0; i<4; i++) {
willCallBack(function(msg) {
result += msg + i + '\n';
});
}
// works, but kinda ugly
for(var i=0; i<4; i++) {
willCallBack(function(i) {
return function(msg) {
result2 += msg + i + '\n';
};
}(i));
}
// part of API, cant change
function willCallBack(cb) {
window.setTimeout(cb, 500, "can't change me");
}
// show the results
window.setTimeout(function(){
alert(result + '\n\n' + result2)
}, 1000);