2

このブロックに間違った角度で来ている場合はお知らせください。起動したい一連の関数があり、それらすべてをループで設定できるようにしたいと考えています。

for(var jj = 0; jj<monster.frames.length;jj++){
    setTimeout(
        functionName(jj),
        1000*jj
    );
}

問題は、その whenが実行されると、その時点までに最後のループ反復値に変更されfunctionName(jj)た値が渡されることです。jj

4

2 に答える 2

13

内部関数に反復ごとに新しい変数があることを確認する必要があります。これを行う最も簡単な方法は、変数を引数として受け取る自己実行型の無名関数を作成することです。関数の呼び出し方法も修正する必要があります。現在は、戻り値をfunctionName(jj)コールバックとして登録しています。これは、その関数が実際に関数を返した場合にのみ問題ありません。

for(var jj = 0; jj<monster.frames.length;jj++){
    (function(jj) {
        setTimeout(
            function() { functionName(jj); },
            1000*jj
        );
    })(jj);
}

部分適用を使用して新しい関数を作成することもできます。ただし、古いブラウザはサポートしていないFunction.prototype.bindため、shim を追加する必要があります。

for(var jj = 0; jj<monster.frames.length; jj++){
    setTimeout(functionName.bind(this, jj), 1000*jj);
}
于 2012-05-17T09:07:14.647 に答える
1

これを試してください:

for(var jj = 0; jj < monster.frames.length; jj++)
{
    (function(x)
    {
        setTimeout(function()
        {
            functionName(x)
        }, 1000 * x);
    })(jj);
}
于 2012-05-17T09:05:52.907 に答える