日期:2014-05-16  浏览次数:20470 次

javascript回调函数在for循环中无法正常访问循环变量,求分析
使用google chrome的console功能进行javascript测试,

var r,i;
s=""//一堆用户名的数组
r=""
for(i = 0;i<10;i++){
    nova_request(function(response){
                    r=r+i+"|"
},'/user/chk/',{key: 'username',vo: s[i]},'get');
}


r的结果10|10|10|10|10|10|10|10|10|10|

希望r的结果0|1|2|3|4|5|6|7|8|9|
javascript 回调函数

------解决方案--------------------
参考
http://www.cnblogs.com/rainman/archive/2009/05/04/1448899.html

中的第4部分
------解决方案--------------------
for(i = 0;i<10;i++){
(function(x){
            nova_request(function(response){
                    r=r+x+"
------解决方案--------------------
"
            },'/user/chk/',{key: 'username',vo: s[x]},'get');
})(i)
}
------解决方案--------------------
引用:
感谢您们的回答!不过我想问下就是按照之前的代码,nova_request没有执行完,循环就继续下去了?


只有nova_request执行完毕才会进行下一次循环!
楼主没有贴出nova_request的具体代码来,估计楼主在nova_request里有异步,那么:没有执行完的就不是nova_request,而是每次执行完nova_request进行回调的函数:function(response){...}。十次循环循环瞬间执行完毕后i值变成了10,而此时累计起来的10个回调才依次执行(异步需要与后台通信,回调函数需要等待响应才能执行,响应的过程中程序正常往下运行。因为这里的循环非常简单,所以在第一个回调响应之前10次循环就全部执行完了),因为i已经等于10,所以结果就会是你看到的“10
------解决方案--------------------
10
------解决方案--------------------
....”。


------解决方案--------------------
其实很简单,因为你没有立即执行它,所以它在内存里的分配是同一位置,最好的方法,是立即执行,重新分配内存。