透过【百度地图API】分析双闭包问题
摘要:
有位API愛好者問到,昨天的教程里為什么不使用for循環?他使用for循環后,也發現代碼無效。這是什么原因?
-------------------------------------------------------------------------------------------------------
我們先來看看他的問題:
寒山 2011-9-8 23:37:36
方法一
marker[i].addEventListener("mouseover", function(){
this.openInfoWindow(infoWindow[i]); });
}
方法二
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已經循環完了。創建一個閉包,相當于在內存中創建一個地方,專門存儲起來。
所以,可以用雙閉包的方式解決:
(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】分析双闭包问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Everyday Mathematic
- 下一篇: 1856: [Scoi2010]字符串