2

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);
4

1 に答える 1

2

「ちょっと醜い」バージョンの代わりに、匿名の自己実行関数ではなく、名前付き関数にコールバックを返すようにすることもできます。多分あなたはそれがそれほど醜くないと思うでしょう?

for(var i=0; i<4; i++) {
    willCallBack(createCallback(i));
}

function createCallback(index) {
    return function(msg) {
        result2 += msg + index + '\n';
    };
}
于 2012-09-24T18:42:43.673 に答える