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);
}