哪个jQuery回调被解雇了?

时间:2012-11-25 21:18:02

标签: javascript jquery ajax jquery-callback

  

可能重复:
  Javascript closure inside loops - simple practical example

让我们假设您在for循环中创建一些ajax请求,如下所示:

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

当然,回调每次都会记录'callback 10 fired',因为回调是异步执行的。 问题是:你怎么知道哪个回调被解雇了?

jsfiddle

3 个答案:

答案 0 :(得分:5)

匿名自调用函数将解决此闭包问题:

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

答案 1 :(得分:5)

使用立即调用的函数表达式创建范围:

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

答案 2 :(得分: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/

注意:您实际上不需要在IIFE中包装整个ajax调用,只需要引用需要引用i的值的回调。