我想知道为什么在下面的代码中,I变量仍然显示"5",而不是显示"1"然后显示2"然后"3"等等?这肯定是一个范围问题,但我并没有真正理解,因为我在全局和dom范围中更改了I变量的范围,但仍然遇到同样的问题。当我在ajax函数外提醒I时,它工作得很好。
for (var i = 0; i < 5; i++) {
$.ajax({
url: '/echo/html/',
method:'post',
data: {
html: 'Ajax data'
},
success: function (resp) {
$('#success').append(i) // always 5
}
})
$('#outsideAjax').append(i); // is okay
}
这是小提琴
编辑:
我选择了@Tushar Gupta解决方案,因为它最适合我的需求,但我遇到了另一个问题,如果我设置此选项,迭代将不起作用:processData:false
查看小提琴
为什么不起作用?
这是由于JavaScript中的闭包。这是修复-
for (var i = 0; i < 5; i++) {
(function(i){
$.ajax({
url: '/echo/html/',
method:'post',
data: {
html: 'Ajax data'
},
success: function (resp) {
$('#success').append(i)
}
})
})(i);
$('#outsideAjax').append(i);
}
您可以使用闭包来修复此问题,包装i:的值
for (var i = 0; i < 5; i++) {
(function(val){
$.ajax({
url: '/echo/html/',
method:'post',
data: {
html: 'Ajax data'
},
success: function (resp) {
$('#success').append(val);
}
})
$('#outsideAjax').append(val); // is okay
})(i);
}
fiddle Demo
var i = 0;
function ajax_call() {
$.ajax({
url: '/echo/html/',
method: 'post',
data: {
html: 'Ajax data'
},
success: function (resp) {
$('#success').append(i++);
if (i < 5) {
ajax_call();
}
}
});
$('#outsideAjax').append(i);
};
ajax_call();
使用Function#bind()
的解决方案:
http://jsfiddle.net/RQncd/1/
for (var i = 0; i < 5; i++) {
$.ajax({
url: '/echo/html/',
method:'post',
data: {
html: 'Ajax data'
},
success: (function (i, resp) {
$('#success').append(i);
}).bind(null, i)
});
$('#outsideAjax').append(i);
}