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|
------解决方案--------------------参考
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进行回调的函数:function(response){...}。十次循环循环瞬间执行完毕后i值变成了10,而此时累计起来的10个回调才依次执行(异步需要与后台通信,回调函数需要等待响应才能执行,响应的过程中程序正常往下运行。因为这里的循环非常简单,所以在第一个回调响应之前10次循环就全部执行完了),因为i已经等于10,所以结果就会是你看到的“10
------解决方案--------------------10
------解决方案--------------------....”。
------解决方案--------------------其实很简单,因为你没有立即执行它,所以它在内存里的分配是同一位置,最好的方法,是立即执行,重新分配内存。