日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/20 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 透过【百度地图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);
}

  



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


結論:

能盡量用別的方式,就不要用閉包解決問題。否則會影響到性能。


總結

以上是生活随笔為你收集整理的透过【百度地图API】分析双闭包问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。