Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于循环奇怪行为的Javascript_Javascript_Jquery_Loops_For Loop - Fatal编程技术网

用于循环奇怪行为的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。