javascript回调函数在for循环中无法正常访问循环变量,求分析

vq 2013-09-15 05:48:55
使用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|
...全文
559 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿鱼 2013-11-01
  • 打赏
  • 举报
回复
发代码的时候先格式化一下吧~~不然看着很头疼 stationArr这个参数值具体是啥? stationNum这个变量貌似也没有声明?
阿鱼 2013-10-31
  • 打赏
  • 举报
回复
引用 6 楼 liangddmy 的回复:
[quote=引用 4 楼 qwklove 的回复:] [quote=引用 3 楼 u011823672 的回复:] 感谢您们的回答!不过我想问下就是按照之前的代码,nova_request没有执行完,循环就继续下去了?
只有nova_request执行完毕才会进行下一次循环! 楼主没有贴出nova_request的具体代码来,估计楼主在nova_request里有异步,那么:没有执行完的就不是nova_request,而是每次执行完nova_request进行回调的函数:function(response){...}。十次循环循环瞬间执行完毕后i值变成了10,而此时累计起来的10个回调才依次执行(异步需要与后台通信,回调函数需要等待响应才能执行,响应的过程中程序正常往下运行。因为这里的循环非常简单,所以在第一个回调响应之前10次循环就全部执行完了),因为i已经等于10,所以结果就会是你看到的“10|10|....”。 [/quote]累计起来的回调函数个数有没有上限? [/quote] 没有上下限之说,回调函数的个数=for循环的次数 你的for循环是for(i = 0;i<10;i++){..., 那么回调函数的个数当然就是10
步枯 2013-10-31
  • 打赏
  • 举报
回复
引用 9 楼 qwklove 的回复:
[quote=引用 8 楼 liangddmy 的回复:] [quote=引用 7 楼 qwklove 的回复:] [quote=引用 6 楼 liangddmy 的回复:] [quote=引用 4 楼 qwklove 的回复:] [quote=引用 3 楼 u011823672 的回复:] 感谢您们的回答!不过我想问下就是按照之前的代码,nova_request没有执行完,循环就继续下去了?
只有nova_request执行完毕才会进行下一次循环! 楼主没有贴出nova_request的具体代码来,估计楼主在nova_request里有异步,那么:没有执行完的就不是nova_request,而是每次执行完nova_request进行回调的函数:function(response){...}。十次循环循环瞬间执行完毕后i值变成了10,而此时累计起来的10个回调才依次执行(异步需要与后台通信,回调函数需要等待响应才能执行,响应的过程中程序正常往下运行。因为这里的循环非常简单,所以在第一个回调响应之前10次循环就全部执行完了),因为i已经等于10,所以结果就会是你看到的“10|10|....”。 [/quote]累计起来的回调函数个数有没有上限? [/quote] 没有上下限之说,回调函数的个数=for循环的次数 你的for循环是for(i = 0;i<10;i++){..., 那么回调函数的个数当然就是10[/quote]但是我这两天写一个程序的时候,for循环次数是18次,每次执行一个回调函数,函数结果写到一个全局数组里面。但是后面使用这个数组的时候里面总是只有11个左右的值,而如果每次执行回调函数的时候都加一个alert(),数组里的值就都有了,请问这个是什么情况?[/quote] “回调函数的个数=for循环次数”这个是没有问题的,你加上alert能全部弹出也再次证明了。 至于数组里不全,那说明数组或者数组处理上有问题~~最好贴下代码....[/quote] function codeAddress() { var geocoder = new google.maps.Geocoder(); var reLocation = new google.maps.LatLng(); geocoder.geocode({ 'address': stationArr[j]}, function (results, status) { if (status == google.maps.GeocoderStatus.OK) { locationArr[j] = results[0].geometry.location; }else{ locationArr[j] = null; } j++; if (j < stationArr.length){ codeAddress(); }else{ for(k=0;k<stationNum;k++){ if(locationArr[k]==null)locationArr[k]=locationArr[k-1]; } midN=Math.ceil(stationNum/2); var mapOptions = { center: locationArr[midN], zoom: 5, mapTypeId: google.maps.MapTypeId.ROADMAP }; var map = new google.maps.Map(document.getElementById("map_canvas"),mapOptions); var lineCoordinates = [locationArr // new google.maps.LatLng(39.929748,116.404052), // new google.maps.LatLng(34.374045,108.938842), // new google.maps.LatLng(31.292634,121.475401) ]; var lineSymbol = {path: google.maps.SymbolPath.FORWARD_OPEN_ARROW}; var line = new google.maps.Polyline({ path: lineCoordinates, icons: [{icon: lineSymbol,offset: '100%'}], strokeColor: "#0000FF", strokeOpacity: 0.6, map: map }); } }); } codeAddress();功能就是将一个数组里面的地理位置进行编码,然后再地图上绘出折线。。。位置超过11个后面的地理编码就不进行了,
阿鱼 2013-10-31
  • 打赏
  • 举报
回复
引用 8 楼 liangddmy 的回复:
[quote=引用 7 楼 qwklove 的回复:] [quote=引用 6 楼 liangddmy 的回复:] [quote=引用 4 楼 qwklove 的回复:] [quote=引用 3 楼 u011823672 的回复:] 感谢您们的回答!不过我想问下就是按照之前的代码,nova_request没有执行完,循环就继续下去了?
只有nova_request执行完毕才会进行下一次循环! 楼主没有贴出nova_request的具体代码来,估计楼主在nova_request里有异步,那么:没有执行完的就不是nova_request,而是每次执行完nova_request进行回调的函数:function(response){...}。十次循环循环瞬间执行完毕后i值变成了10,而此时累计起来的10个回调才依次执行(异步需要与后台通信,回调函数需要等待响应才能执行,响应的过程中程序正常往下运行。因为这里的循环非常简单,所以在第一个回调响应之前10次循环就全部执行完了),因为i已经等于10,所以结果就会是你看到的“10|10|....”。 [/quote]累计起来的回调函数个数有没有上限? [/quote] 没有上下限之说,回调函数的个数=for循环的次数 你的for循环是for(i = 0;i<10;i++){..., 那么回调函数的个数当然就是10[/quote]但是我这两天写一个程序的时候,for循环次数是18次,每次执行一个回调函数,函数结果写到一个全局数组里面。但是后面使用这个数组的时候里面总是只有11个左右的值,而如果每次执行回调函数的时候都加一个alert(),数组里的值就都有了,请问这个是什么情况?[/quote] “回调函数的个数=for循环次数”这个是没有问题的,你加上alert能全部弹出也再次证明了。 至于数组里不全,那说明数组或者数组处理上有问题~~最好贴下代码....
步枯 2013-10-31
  • 打赏
  • 举报
回复
引用 7 楼 qwklove 的回复:
[quote=引用 6 楼 liangddmy 的回复:] [quote=引用 4 楼 qwklove 的回复:] [quote=引用 3 楼 u011823672 的回复:] 感谢您们的回答!不过我想问下就是按照之前的代码,nova_request没有执行完,循环就继续下去了?
只有nova_request执行完毕才会进行下一次循环! 楼主没有贴出nova_request的具体代码来,估计楼主在nova_request里有异步,那么:没有执行完的就不是nova_request,而是每次执行完nova_request进行回调的函数:function(response){...}。十次循环循环瞬间执行完毕后i值变成了10,而此时累计起来的10个回调才依次执行(异步需要与后台通信,回调函数需要等待响应才能执行,响应的过程中程序正常往下运行。因为这里的循环非常简单,所以在第一个回调响应之前10次循环就全部执行完了),因为i已经等于10,所以结果就会是你看到的“10|10|....”。 [/quote]累计起来的回调函数个数有没有上限? [/quote] 没有上下限之说,回调函数的个数=for循环的次数 你的for循环是for(i = 0;i<10;i++){..., 那么回调函数的个数当然就是10[/quote]但是我这两天写一个程序的时候,for循环次数是18次,每次执行一个回调函数,函数结果写到一个全局数组里面。但是后面使用这个数组的时候里面总是只有11个左右的值,而如果每次执行回调函数的时候都加一个alert(),数组里的值就都有了,请问这个是什么情况?
步枯 2013-10-30
  • 打赏
  • 举报
回复
引用 4 楼 qwklove 的回复:
[quote=引用 3 楼 u011823672 的回复:] 感谢您们的回答!不过我想问下就是按照之前的代码,nova_request没有执行完,循环就继续下去了?
只有nova_request执行完毕才会进行下一次循环! 楼主没有贴出nova_request的具体代码来,估计楼主在nova_request里有异步,那么:没有执行完的就不是nova_request,而是每次执行完nova_request进行回调的函数:function(response){...}。十次循环循环瞬间执行完毕后i值变成了10,而此时累计起来的10个回调才依次执行(异步需要与后台通信,回调函数需要等待响应才能执行,响应的过程中程序正常往下运行。因为这里的循环非常简单,所以在第一个回调响应之前10次循环就全部执行完了),因为i已经等于10,所以结果就会是你看到的“10|10|....”。 [/quote]累计起来的回调函数个数有没有上限?
阿鱼 2013-09-16
  • 打赏
  • 举报
回复
引用 3 楼 u011823672 的回复:
感谢您们的回答!不过我想问下就是按照之前的代码,nova_request没有执行完,循环就继续下去了?
只有nova_request执行完毕才会进行下一次循环! 楼主没有贴出nova_request的具体代码来,估计楼主在nova_request里有异步,那么:没有执行完的就不是nova_request,而是每次执行完nova_request进行回调的函数:function(response){...}。十次循环循环瞬间执行完毕后i值变成了10,而此时累计起来的10个回调才依次执行(异步需要与后台通信,回调函数需要等待响应才能执行,响应的过程中程序正常往下运行。因为这里的循环非常简单,所以在第一个回调响应之前10次循环就全部执行完了),因为i已经等于10,所以结果就会是你看到的“10|10|....”。
田想兵 2013-09-16
  • 打赏
  • 举报
回复
其实很简单,因为你没有立即执行它,所以它在内存里的分配是同一位置,最好的方法,是立即执行,重新分配内存。
vq 2013-09-15
  • 打赏
  • 举报
回复
感谢您们的回答!不过我想问下就是按照之前的代码,nova_request没有执行完,循环就继续下去了?
似梦飞花 2013-09-15
  • 打赏
  • 举报
回复
for(i = 0;i<10;i++){ (function(x){ nova_request(function(response){ r=r+x+"|" },'/user/chk/',{key: 'username',vo: s[x]},'get'); })(i) }
孟子E章 2013-09-15
  • 打赏
  • 举报
回复
参考 http://www.cnblogs.com/rainman/archive/2009/05/04/1448899.html 中的第4部分

87,992

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧