1

どうすればこれを入手できますか

var i = 0;
var codes = [1, 2, 3];

for (var i = 0; i < codes.length; ++i)
{
    setTimeout(function(){alert(codes[i]);},100);
}

alert 12そしてキーワード3を使用せずに?let

または要素のイベントをバインドします():

var i = 0;
var codes = [1, 2, 3];

for (var i = 0; i < codes.length; ++i)
{
    $("div").eq(i).click(function(){
        alert( codes[i] );
    });
}
4

5 に答える 5

4

自己実行型の無名関数を使用し、i変数クロージャの引数として渡します。

var i = 0;
var codes = [1, 2, 3];

for (var i = 0; i < codes.length; ++i)
{
    (function( index ) {
        setTimeout(function(){alert(codes[index]);},100);
    })(i);
}

これが例です。

于 2011-03-08T00:20:32.563 に答える
3

クロージャを利用する必要があります。私は通常、目的のコンテキストで定義された関数を返す「ジェネレーター」関数を作成します。

var i = 0;
var codes = [1, 2, 3];
function callbackGenerator(i) { 
   return function(){alert(codes[i]);}
}

for (var i = 0; i < codes.length; ++i)
{
    setTimeout(callbackGenerator(i), 100);
}

詳細と良い例はこちら: https ://developer.mozilla.org/en/JavaScript/Guide/Closures

于 2011-03-08T00:23:38.907 に答える
1
var i = 0;
var codes = [1, 2, 3];

var timeoutFunc = function() {
    alert(codes[i++]);
    if (i < codes.length) {
        setTimeout(timeoutFunc, 100);
    }
};

setTimeout(timeoutFunc, 100);
于 2011-03-08T00:13:56.947 に答える
1

これでうまくいくはずです。

var codes = [1, 2, 3];

for (var i = 0; i < codes.length; ++i)
    setTimeout(function(code){return function(){
        alert(code);
    }}(codes[i]), 100);
于 2011-03-08T00:24:21.793 に答える
1

自己実行関数を使用します:

for (var i = 0; i < codes.length; ++i) (function(bound_i) {
    setTimeout(function(){alert(codes[bound_i]);},100);
})(i);

オプションvarで、より詳細なコードのステートメントを使用します。

for (var i = 0; i < codes.length; ++i) (function() {
    var bound_i = i;
    setTimeout(function(){alert(codes[bound_i]);},100);
})();

または、次の場合は、代わりに名前付き関数を使用してください。

function foo(i) {
    setTimeout(function(){alert(codes[i]);},100);
}

for (var i = 0; i < codes.length; ++i) {
    foo(i);
}

どちらの例もクロージャを形成し、新しい変数スコープを導入します。または、ES5には無名関数で使用できるFunction.bindがありますが、まだすべてのブラウザーでサポートされているわけではありません。(私はIEのことを考えています。)

于 2011-03-08T00:24:55.450 に答える