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|
...全文
551 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部分
JavaScript核心技术 简介: 《JavaScript核心技术》对于各种浏览器、浏览器版本、JavaScript版本、DOM版本的介绍,有助于我们理解所遇到的各种新旧代码,使我们能够对这些代码做出正确的取舍。《JavaScript核心技术》还提供了一些使用JavaScript的最佳实践。无论是新手还是老手,这些如何正确使用JavaScript的经验都能帮助他们养成良好的编程习惯。《JavaScript核心技术》还介绍了一些调试和开发JavaScript的工具,这些工具无疑能够提高我们的开发效率。 《JavaScript核心技术》最后对于Ajax和几个流行的JavaScript库的介绍,无疑会开阔我们在JavaScript使用上的思路。 《JavaScript核心技术》是一本真正意义上的“新书”,不仅介绍了最新的JavaScript知识和方向,还完全覆盖了当今Web开发关于JavaScript的所有重要话题,它使用了大量实例代码,图文并茂地讲解了使用JavaScript的各个层次和领域的内容。它不是一本参考手册,但却是一本值得拥有的教程。 JavaScript核心技术 目录: 前言 第1章JavaScript初探 1.1规范和实现相互交织的历史 1.2跨浏览器的不兼容性和其他常见的JavaScript传说 1.3你能用JavaScript来做什么 1.4JavaScript初探:“HelloWorld!” 1.5JavaScript沙箱 1.6可访问性和JavaScript的最佳实践 第2章JavaScript数据类型与变量 2.1变量的标识 2.2作用域 2.3简单类型 2.4常量:有名称但不改变 2.5习题 第3章运算符和语句 3.1JavaScript语句的格式 3.2简单语句 3.3条件语句和程序流 3.4条件运算符 3.5逻辑运算符 3.6高级语句:循环语句 3.7习题 第4章JavaScript对象 4.1对象构造函数 4.2Number对象 4.3String对象 4.4正则表达式与RegExp 4.5有专门用途的对象:Date和Math 4.6JavaScript数组 4.7关联数组:不是数组的数组 4.8习题 第5章函数 5.1定义函数:细数所有方式 5.2回调函数 5.3函数和递归 5.4嵌套函数、函数闭包和内存泄漏 5.5作为对象的函数 5.6习题 第6章捕捉事件 6.1O级DOM上的事件句柄 6.22级DOM上的事件句柄 6.3产生事件 6.4习题 第7章表单与即时验证 7.1访问表单 7.2把事件附加在表单上:不同的方法 7.3选择列表 7.4单选按钮和复选框 7.5输入字段和JiT正则表达式 7.6习题 第8章沙箱及之上的cookie、连通性和隐私 第9章基础浏览器对象 第10章DOM:文档对象模型 第11章创建定制的JavaScript对象 第12章构建动态网页:在脚本加入样式 第13章使用Ajax 第14章好消息:生动的程序库!令人惊异的Web服务!有趣的API! 附录习题答案

87,992

社区成员

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

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