博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
透过【百度地图API】分析双闭包问题
阅读量:6266 次
发布时间:2019-06-22

本文共 1136 字,大约阅读时间需要 3 分钟。

原文:

摘要:

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

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

我们先来看看他的问题:

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

方法一

for(var i=0; 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[x].addEventListner("mouseover",function(){
this.openInfoWindow(infoWindow[x]);
}); })(i); }

  

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

所以,我们换一种方式:

function _openInfoWindow(){
this.openInfoWindow(this._infoWindow);}
for(var i=0;i

  

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

结论:

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

转载地址:http://bwdpa.baihongyu.com/

你可能感兴趣的文章
初识少儿编程
查看>>
浏览器 UA 判断
查看>>
理解OAuth 2.0
查看>>
高并发处理思路与手段(三):消息队列
查看>>
Docker+Nginx部署Angular
查看>>
Docker & ASP.NET Core (4):容器间的连接
查看>>
beam 的异常处理 Error Handling Elements in Apache Beam Pipelines
查看>>
将png图片转换为字体图标
查看>>
/var/log/wtmp
查看>>
C# 获取机器码
查看>>
什么是医嘱?医嘱的书写内容?
查看>>
如何通过CSP编程卸载Windows Mobile应用程序
查看>>
用delphi实现完美屏幕截图
查看>>
matlab练习程序(差异演化DE)
查看>>
这就是搜索引擎:核心技术详解
查看>>
加解密技术处理时间对比
查看>>
g++命令行详解 (转)
查看>>
Ubuntu菜鸟入门(九)—— 支付宝支付控件安装
查看>>
什么是 SRS 呢?在我们大部分的音频播放器里都内欠有这种音效。
查看>>
对/etc/rc.d/init.d目录的一点理解(转)
查看>>