js循环里进行回调,引用循环里的变量,发现只是最后值的问题
做项目的时候,栽在一个小地方,是这样的
我有很多个坐标点,我想把这些坐标点都绑定一个事件,当点击了这个坐标点之后,发送一个ajax 请求,将坐标点的id 发出去,等待显示返回的数据
但是实际当中,无论我点击了哪个点,都发现发送的ajax 请求都是最后一个点的id值上,
仔细一想,确实是这么回事,因为点击这个事情是异步,当执行ajax的时候,遍历早已结束,所以返回最后一点是正常的。
问题变成了,怎样让回调函数读取到每次的临时变量,也就是个闭包的问题
平时对闭包不是太清楚,所以顺便复习一下了,
参考资料也是博客园朋友写的 http://kb.cnblogs.com/page/110782/
之后也参考了这里 http://stackoverflow.com/questions/6978911/closure-inside-a-for-loop-callback-with-loop-variable-as-parameter
这里大概这么处理
在循环里写
function build_callback(id){
returnfunction(data, textStatus){
alert(id);
};
}
$.get("XXXX",build_callback(id))
也可以使用匿名函数解决
for (var idx=1; idx<=15; idx++)
(function(idx) {
var probeIP = siteConfigArray[idx].siteIP;
if (probeIP != "" && probeIP != null)
jQuery.get("svGetPortInfo.php?svSiteIpAddr=" + probeIP+"&s="+idx,
function(data, textStatus) { test(data, textStatus, idx); }, 'text');
else // IP value is blank
siteConfigArray[idx].portManifest = null;
})(idx);
最后,如果有人用coffeescript 来写,那就变得更简单了,只需要在循环里在加一句 do (XXX) ->
coffeescript就会自动生成好闭包,这里是我的代码
for node in stations
do (node) ->
point = new BMap.Point(node.lng,node.lat)
marker = new BMap.Marker(point)
label = new BMap.Label(node.name, {offset: new BMap.Size(20, 4)})
marker.setLabel(label) contextMenu = new BMap.ContextMenu()
contextMenu.addItem(new BMap.MenuItem("查看 #{node.name} 详情", () ->
$.get("stations/#{node.id}",(data)->
eval data
) , 200))
window.map.addOverlay(marker)
marker.addContextMenu(contextMenu)
coffeescript 也给出了官方例子
for filename in list
do (filename) ->
fs.readFile filename, (err, contents) ->
compile filename, contents.toString()
会对应生成这样的js
var filename, _fn, _i, _len;
_fn = function(filename) {
return fs.readFile(filename, function(err, contents) {
return compile(filename, contents.toString());
});
};
for (_i = 0, _len = list.length; _i < _len; _i++) {
filename = list[_i];
_fn(filename);
}
js循环里进行回调,引用循环里的变量,发现只是最后值的问题的更多相关文章
- js中this和回调方法循环-我们到底能走多远系列(35)
我们到底能走多远系列(35) 扯淡: 13年最后一个月了,你们在13年初的计划实现了吗?还来得及吗? 请加油~ 主题: 最近一直在写js,遇到了几个问题,可能初入门的时候都会遇到吧,总结下. 例子: ...
- js的for循环中出现异步函数,回调引用的循环值始终是最后的值
一.问题 今天工作中解决bug发现是由“for循环的异步函数,回调引用的循环值始终是最后的值”的现象导致的,如: for (var i = 0; i < files.length; i++) { ...
- node.js的作用、回调、同步异步代码、事件循环
http://www.nodeclass.com/articles/39274 一.node.js的作用 I/O的意义,(I/O是输入/输出的简写,如:键盘敲入文本,输入,屏幕上看到文本显示输出.鼠标 ...
- Spring里bean之间的循环依赖解决与源码解读
通过前几节的分析,已经成功将bean实例化,但是大家一定要将bean的实例化和完成bean的创建区分开,bean的实例化仅仅是获得了bean的实例,该bean仍在继续创建之中,之后在该bean实例的基 ...
- iOS开发笔记15:地图坐标转换那些事、block引用循环/weak–strong dance、UICollectionviewLayout及瀑布流、图层混合
1.地图坐标转换那些事 (1)投影坐标系与地理坐标系 地理坐标系使用三维球面来定义地球上的位置,单位即经纬度.但经纬度无法精确测量距离戒面积,也难以在平面地图戒计算机屏幕上显示数据.通过投影的方式可以 ...
- Block中的引用循环
原文地址:http://www.cnblogs.com/lujianwenance/p/5910490.html Block在实际的开发中非常的常用,事件回调.传值.封装成代码块调用等等.很多人都对b ...
- Node.js event loop 和 JS 浏览器环境下的事件循环的区别
Node.js event loop 和 JS 浏览器环境下的事件循环的区别: 1.线程与进程: JS 是单线程执行的,指的是一个进程里只有一个主线程,那到底什么是线程?什么是进程? 进程是 CPU ...
- Xcode8的调试技能Memory Graph 实战解决闭包引用循环问题
Xcode8的调试技能又增加了一个黑科技:Memory Graph.简单的说就是可以在运行时将内存中的对象生成一张图. 那么通过一个实际项目来练习一下吧. 首先我们写了一个自定义UIView:MyVi ...
- JS系列:三元运算符与循环
三元运算符 语法: 条件?成立做的事情:不成立做的事情:<=>相当于简单的if/else判断(简化写法) var num = 12; if(num>10){ num ++; }el ...
- 如何在 vue 项目里正确地引用 jquery 和 jquery-ui的插件
copy内容的网址: https://segmentfault.com/a/1190000007020623 使用vue-cli构建的vue项目,webpack的配置文件是分散在很多地方的,而我们需要 ...
随机推荐
- sql去掉换行符
select replace(replace(ServiceCall,CHAR(13),''),CHAR(10),'') from outbound_complaint where bz1='朱成 ...
- C#数据类型及差异(复习专用)
一.数据类型 值类型 类型 描述 范围 默认值 bool 布尔值 True 或 False False byte 8 位无符号整数 0 到 255 0 char 16 位 Unicode 字符 U + ...
- 删除XML文档中某节点
前几天Insus.NET在写了一系列XML文档进行操作.创建 <怎样创建XML文档> http://www.cnblogs.com/insus/p/3276944.html & ...
- weekly contest 116
961. N-Repeated Element in Size 2N Array In a array A of size 2N, there are N+1 unique elements, and ...
- Go语言资源教程:Redis介绍安装和使用
Redis的操作和使用 在安装好redis以后,我们这里给大家讲一下redis操作的一些知识. Redis支持的数据类型:string,hash,list,set,sorted set 我们来练习一下 ...
- 通过IDEA及hadoop平台实现k-means聚类算法
由于实验室任务方向变更,本文不再更新~ 有段时间没有操作过,发现自己忘记一些步骤了,这篇文章会记录相关步骤,并随时进行补充修改. 1 基础步骤,即相关环境部署及数据准备 数据文件类型为.csv文件,e ...
- c++构造函数问题,初始化和赋值问题
默认构造函数(就是没有参数的构造函数) The Default ConstructorThe default constructor is the constructor used to create ...
- Linq中的group by多表多字段,Sum求和
//Line to Sql 写法 var data = (from a in Items group a by new { a.GroupId, a.Id } into b //orderby new ...
- 3. mybatis # 与 $ 的区别
mybatis # 与 $ 的区别 1.# % 号必须写在test中 应用场景:模糊查询 配置文档mapper.xml <select id="selectBlogByTitle&qu ...
- php 伪造HTTP_REFERER页面URL来源的三种方法
php获取当前页面的前一个页面URL地址,即当前页面是从哪个页面链接过来的,可以使用$_SERVER['HTTP_REFERER']; 但是$_SERVER['HTTP_REFERER']也是可以被伪 ...