透过【百度地图API】分析双闭包问题

原文:透过【百度地图API】分析双闭包问题

摘要:

  有位API爱好者问到,昨天的教程里为什么不使用for循环?他使用for循环后,也发现代码无效。这是什么原因?

-------------------------------------------------------------------------------------------------------

我们先来看看他的问题:

寒山 2011-9-8 23:37:36

方法一

for(var i=0; i<marker.length; i++){marker[i].addEventListener("mouseover", function(){this.openInfoWindow(infoWindow[i]);    });}

  

方法二

marker[2].addEventListener("mouseover", function(){this.openInfoWindow(infoWindow[2]);});
marker[1].addEventListener("mouseover", function(){this.openInfoWindow(infoWindow[1]);});

  

用户提问:
这两种方式有什么区别吗? 为什么前面用循环的不可以,后面的就可以..

-------------------------------------------------------------------------------------------------------

解答:

首先,我们要知道,this.openInfoWindow(infoWindow[i])中的i最后的值是marker.length-1

数组的下标是从0开始的,0,1,2……(N-1)

以闭包方式解决的原因如下:

i是外层的变量,是callback上层作用域的,callback执行的时候,for已经循环完了。创建一个闭包,相当于在内存中创建一个地方,专门存储起来。

所以,可以用双闭包的方式解决:

for(var i=0;i<marker.length;++i){(function(x){
    marker[x].addEventListner("mouseover",function(){    this.openInfoWindow(infoWindow[x]);
    });})(i);}

  

双闭包的代码会创建marker.length*2个匿名函数。下面这段代码只有一个_openInfoWindow。

所以,我们换一种方式:

function _openInfoWindow(){  this.openInfoWindow(this._infoWindow);}
for(var i=0;i<markers.length;++i){  marker[i]._infoWindow = infoWindow[i];  marker[i].addEventListner("mouseover",_openInfoWindow);}

  

-------------------------------------------------

结论:

能尽量用别的方式,就不要用闭包解决问题。否则会影响到性能。

时间: 2024-10-23 05:19:15

透过【百度地图API】分析双闭包问题的相关文章

百度地图API详解之事件机制,function“闭包”解决for循环和监听器冲突的问题:

原文:百度地图API详解之事件机制,function"闭包"解决for循环和监听器冲突的问题:  百度地图API详解之事件机制 2011年07月26日 星期二 下午 04:06 和DOM编程里的事件模型一样,百度地图API也提供了类似的事件机制.本文介绍了事件监听的添加和移除方法,this指针和事件参数的使用以及绑定事件监听函数中涉及的闭包问题,最后分享了一个用来增强地图API事件机制的开源项目. 事件添加和移除 我们最简单的事件开始,下面的代码示例给map对象添加了click事件的监

急急急!C#web百度地图api调用

问题描述 急急急!C#web百度地图api调用 vs2010下开发的网页地图 实现:从SQL数据库读取全部经纬度信息,然后都标注在地图上 我想实现从数据库读取经纬度,然后把三个点都标注在地图上 已经纠结好长时间了,大家做过的来指导下 解决方案 用DataReader从数据库读取经纬度传串成一个字符串然后赋值给一个全局变量,使用服务器端标签<%%>给aspx页面的js变量,然后js依据这个js变量生成Marker while(dr.Read()) { s+=",{lng:"+

【百度地图API】手机浏览器抓包工具及其使用方法

原文:[百度地图API]手机浏览器抓包工具及其使用方法 摘要:为了测试地图API在手机浏览器上的性能,需要给手机浏览器设置代理.通过代理,我们可以在PC上获取到抓包数据.进而对性能做进一步分析.   ------------------------------------------------------ 一.手机浏览器抓包工具 Paros 3.2.13   二.如何配置 1.将电脑和手机连到同一个wifi环境中 2.找到电脑的IP 可以点击网卡图标,找到IP信息 也可以在cmd下,使用ipc

eclipse-android应用百度地图api导入sdk出错 报错代码如下 求大神指点

问题描述 android应用百度地图api导入sdk出错 报错代码如下 求大神指点 Dex Loader] Unable to execute dex: Multiple dex files define Lcom/baidu/mapapi/BMapManager;baidumapapi] Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files define Lcom/baidu/mapapi/B

百度地图API显示多个标注点,解决提示信息问题以及给标注增加地图旁的文字连接提示的另一种解决办法

原文:百度地图API显示多个标注点,解决提示信息问题以及给标注增加地图旁的文字连接提示的另一种解决办法 公司的网站改版要求在一个页面显示百度地图.上面要同时显示很多标注点,标注点当然要有提示信息嘛,提示信息也当然要不一样嘛,因为给标注绑定的鼠标事件当你移动鼠标上去的其实循环值已经是最后值了,所以无论你怎么做,所有的标注点都是同一个提示,就是最后的那个提示.我就打开百度找方案嘛.一找之下,搜了几十页就一个解决方案,大家都是你拷贝我的我拷贝你的.做个闭包.把循环的值锁定在里面.代码照着做,也的确可以

【百度地图API】如何用圆形搜索获取中心点周围100米内全部关键点?如天安门附近所有的餐厅、加油站、宾馆、大厦等

原文:[百度地图API]如何用圆形搜索获取中心点周围100米内全部关键点?如天安门附近所有的餐厅.加油站.宾馆.大厦等 摘要: 在LBS上有这样一个常用的功能,查找附近所有的关键点(POI点,比如标志性建筑物,餐厅,大厦,加油站等).相信大家对search已经非常熟悉了,可是search必须要传"关键字"参数,即使是多关键字搜索,也要把所有POI的tag都一一列举出来,才能搜索到结果.那么,有没有什么办法,可以不用关键字,就搜索到附近全部的POI呢? 答案是肯定的.我们一起来学习一下吧

大神们!!百度地图api中标签信息的抓取啊。前js后C#。

问题描述 大神们!!百度地图api中标签信息的抓取啊.前js后C#. 是这样的,一个地图api的调用,我需要获取到百度地图api上的搜索出来的信息,可是获取不到啊啊啊... 解决方案 js版的百度地图还是其他版本的? js版本的,C#是运行于服务器端的,无法直接获取客户端的数据.js搜索后你自己即那个解码后的信息用ajax回发到服务器进行获取

Android中使用百度地图API:ItemizedOverlay

Overlay简介 Overlay通常被译为"图层"或"覆盖物".那么对于地图而言,什么称之为覆盖物?"所 有叠加或覆盖到地图之上的内容,都被称之为地图覆盖物,如标注.矢量图形元素(包括:折线和多边形和圆) .定位图标等.覆盖物拥有自己的地理坐标,当您拖动或缩放地图时,它们会相应的移动." 为了让大家 能够对Overlay有更进一步的认识,我们再通过下面的图形来直观的认识它. 图中标记的那些红色的图标 A,B,...,J正是Overlay的其中一

Android中使用百度地图API:公交换乘方案搜索

这是我写的第3篇介绍调用百度地图API搜索服务的文章,所以对搜索前要做的其它工作不再介绍,再加上 代码中的注释也对相关的操作.方法做了尽可能详细的说明,所以直接看示例吧. 1)布局文件 res/layout/main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/andro