Javascript 在函数中使用查询的json数据

Javascript 在函数中使用查询的json数据,javascript,jquery,json,closures,visibility,Javascript,Jquery,Json,Closures,Visibility,我有一个类似的代码: $.ajax({ success: function(data) { text = ''; for (var i = 0; i< data.length; i++) { text = text + '<a href="#" id="Data_'+ i +'">' + data[i].Name + "</a><br />";

我有一个类似的代码:

$.ajax({
        success: function(data) {
            text = '';
            for (var i = 0; i< data.length; i++) {
                text = text + '<a href="#" id="Data_'+ i +'">' + data[i].Name + "</a><br />";
            }            
            $("#SomeId").html(text);

            for (var i = 0; i< data.length; i++) {
                $("#Data_"+i).click(function() {
                    alert(data[i]);
                    RunFunction(data[i]);
                    return false;
                });                
            }
        }
    });
$.ajax({
成功:功能(数据){
文本='';
对于(变量i=0;i”;
}            
$(“#SomeId”).html(文本);
对于(变量i=0;i
这将获取一个json格式的数据数组,然后遍历该数组,为每个条目生成一个链接。现在,我想为每个链接添加一个函数,该函数将运行一个处理该数据的函数。问题是,调用ajax成功函数后,数据似乎不可用(虽然我认为它们的行为类似于闭包)。以后使用查询的json数据的最佳方式是什么?(我认为将其设置为全局变量可以完成这项工作,但我希望避免这样做,主要是因为此ajax请求可能会被多次调用)


谢谢。

您的问题是
i
变量由回调共享

因此,所有回调都在最后一项上运行

最简单的解决方案是使用:

这将对每次迭代进行单独的函数调用,因此每次迭代都会有一个单独的
i
变量(或者在本例中是参数)。

您可以直接使用并传递数据:

for (var i = 0; i< data.length; i++) {
    $("#Data_"+i).bind('click', {data: data[i]}, function() {
         alert(event.data.data);
          RunFunction(event.data.data);
          return false;
    });                
 }
for(变量i=0;i
我认为您犯了一个典型的错误,试图在循环中生成函数。变量
I
对于所有函数都具有相同的值,但在循环结束时它甚至不再是有效的数组索引


另请参见(无意冒犯),例5。

SLaks的答案很好,但他没有解释为什么它不起作用

问题是由于作用域造成的。请尝试以下操作:

var logger = function(x){
  console.log(x);
};
for(var j = 0; j < 10; j++){
  window.setTimeout(function(){
    logger(j);
  }, 1000);
}
var记录器=功能(x){
控制台日志(x);
};
对于(var j=0;j<10;j++){
setTimeout(函数(){
记录器(j);
}, 1000);
}
这个漂亮的小函数只输出了…9s!这是因为对j的引用由超时保存,所以在超时运行时,j已经设置为9

与之相比:

var logger = function(x){
  console.log(x);
};
for(var j = 0; j < 10; j++){
  // we're wrapping our call in an anonymous function
  // don't do this in production code...make the function external instead
  // so you don't create 10 functions
  (function(k){
    window.setTimeout(function(){
      logger(k);
    }, 1000);
  })(j);
}
var记录器=功能(x){
控制台日志(x);
};
对于(var j=0;j<10;j++){
//我们正在用匿名函数包装调用
//不要在生产代码中执行此操作…改为将函数设置为外部函数
//所以你不需要创建10个函数
(职能(k){
setTimeout(函数(){
记录器(k);
}, 1000);
})(j) );
}

此版本将内部调用封装在一个匿名函数中,该函数以索引作为参数。由于k的作用域现在仅限于该函数,因此记录器的工作方式与您所期望的一样。

无意冒犯。我确信闭包没有如我所期望的那样工作,我只是不知道如何使它们工作。
var logger = function(x){
  console.log(x);
};
for(var j = 0; j < 10; j++){
  // we're wrapping our call in an anonymous function
  // don't do this in production code...make the function external instead
  // so you don't create 10 functions
  (function(k){
    window.setTimeout(function(){
      logger(k);
    }, 1000);
  })(j);
}