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:20:09.580 回答
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 回答
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 回答