2

重複の可能性:
ループ内の Javascript クロージャー - 簡単な実用例

次のような for ループでいくつかの ajax リクエストを作成するとします。

$(function(){
    for(var i=0;i<10;i++){
      $.ajax({
        url : '/',
        success : function(){
          console.log('callback '+i+' fired!');
        }
      });
    }
});

もちろん、コールバックは非同期で実行されるため、コールバックは毎回「コールバック 10 発生」をログに記録します。問題は、どのコールバックが起動したかをどのように知ることができるかということです。

jsfiddle

4

3 に答える 3

5

すぐに呼び出される関数式でスコープを作成します。

$(function(){
    for(var i=0;i<10;i++){
      (function(i){
        $.ajax({
          url : '/',
          success : function(){
            console.log('callback '+i+' fired!');
          }
        });
      })(i);
    }
});
于 2012-11-25T21:21:29.153 に答える
5

匿名の自己呼び出し関数は、この閉鎖の問題を解決します。

$(function(){
    for(var i=0;i<10;i++){
      (function(i) {
          $.ajax({
            url : '/',
            success : function(){
              console.log('callback '+i+' fired!');
            }
          });
      })(i);
    }
});
于 2012-11-25T21:20:09.580 に答える
2

iクロージャーの一部としての現在の値を渡すことにより:

$(function(){
    for(var i=0;i<10;i++){
      $.ajax({
        url : '/',
        success : (function(i){
          return function(){console.log('callback '+i+' fired!');}
        })(i)
      });
    }
});

ここにデモがあります:http://jsfiddle.net/rRwgW/4/

注: 実際には ajax 呼び出し全体を IIFE でラップする必要はなく、 の値を参照する必要があるコールバックだけをラップする必要がありますi

于 2012-11-25T21:21:02.287 に答える