用于循环奇怪行为的Javascript
我觉得很奇怪,我得到了这样的输出:用于循环奇怪行为的Javascript,javascript,jquery,loops,for-loop,Javascript,Jquery,Loops,For Loop,我觉得很奇怪,我得到了这样的输出: Wait.. Request 2 Complete. Request 2 Complete. 在一个简单的for循环上: for (var i = 0, j = urls.length; i < j; i += 1) { $.ajax({ url: urls[i], dataType: 'jsonp', complete: function() { log.append('
Wait..
Request 2 Complete.
Request 2 Complete.
在一个简单的for循环上:
for (var i = 0, j = urls.length; i < j; i += 1) {
$.ajax({
url: urls[i],
dataType: 'jsonp',
complete: function() {
log.append('Request ' + i + ' Complete.' + "\n");
if (i == (j - 1)) {
log.append('Done.');
}
}
});
}
for(变量i=0,j=url.length;i
为什么
i
总是等于2
?这是因为ajax请求中对i
的两个调用都引用了for
-循环的相同i
。此时,当请求完成时(从而访问i
),循环终止,i
具有最终值,此处为2
我想你在寻找这样的东西:
for (var i = 0, j = urls.length; i < j; i += 1) {
!function( i ){
$.ajax({
url: urls[i],
dataType: 'jsonp',
complete: function() {
log.append('Request ' + i + ' Complete.' + "\n");
if (i == (j - 1)) {
log.append('Done.');
}
}
});
}( i );
}
for(变量i=0,j=url.length;i
通过将
i
的值传递给立即执行的函数,您可以创建i
的相应值的副本,以在ajax请求中使用。这是因为在ajax请求中对i
的两个调用都引用了for
-循环的相同i
。此时,当请求完成时(从而访问i
),循环终止,i
具有最终值,此处为2
我想你在寻找这样的东西:
for (var i = 0, j = urls.length; i < j; i += 1) {
!function( i ){
$.ajax({
url: urls[i],
dataType: 'jsonp',
complete: function() {
log.append('Request ' + i + ' Complete.' + "\n");
if (i == (j - 1)) {
log.append('Done.');
}
}
});
}( i );
}
for(变量i=0,j=url.length;i
通过将i
的值传递给立即执行的函数,可以创建i
的相应值的副本,以在ajax请求中使用。尝试使用
async = false;
in ajax request
试用
async = false;
in ajax request
这将解决i值的问题,但站点速度会慢得多。Sirkos解决方案是更好的方法。这将解决i值的问题,但站点将慢得多。Sirkos解决方案是更好的方法。出现问题的原因是闭包在变量i上关闭,而不是在创建闭包时它的值。JavaScript以外的许多语言都存在这个问题,包括C#和Visual Basic。如果您想了解此极其常见的错误的更多背景信息,请搜索“访问修改的闭包”。出现此问题的原因是闭包在变量i上关闭,而不是在创建闭包时关闭其值。JavaScript以外的许多语言都存在这个问题,包括C#和Visual Basic。如果你想了解这个极其常见的错误的更多背景信息,请搜索“访问修改的闭包”。您好,先生,这项技术叫什么术语?我想多了解一些。顺便说一句,谢谢@hermine,总的来说,这是JavaScript中的作用域和闭包问题。参见,例如。如果我使用的技术有一个特定的名称,我不知道,但是。@WearetheWorld不知道。但每个请求都有一个唯一的id,其顺序与启动请求的顺序相同。所以,如果你必须对结果进行任何同步,你可以使用这个id。嗨,先生,这项技术叫什么术语?我想多了解一些。顺便说一句,谢谢@hermine,总的来说,这是JavaScript中的作用域和闭包问题。参见,例如。如果我使用的技术有一个特定的名称,我不知道,但是。@WearetheWorld不知道。但每个请求都有一个唯一的id,其顺序与启动请求的顺序相同。因此,如果必须对结果进行任何同步,可以使用该id。