2014-03-04 11 views
-1

我有一個對象Map3,處理顯示我的數據集在谷歌地圖上的標記。它是一個通用對象,我想在很多不同的應用程序中使用它,所以我定義了一個名爲markerInstall的回調函數,它將自定義事件處理函數安裝到我的標記中。實施例使用(簡化):如何避免關閉,當您需要提供回調來安裝事件處理程序

var map = new Map3({ 
    markerInstall: function (marker) { 
     google.maps.event.addListener(marker, 'click', function(e) { 
      window.open('detail.php?id=' + this.my.id); 
     } 
     google.maps.event.addListener(marker, 'mouseover', function(e) { 
      // do something else 
     } 
    } 
}); 

的MAP3對象包含循環是這樣的:

for (i = 0; i < data.length; i++) { 
    ... 
    var m = new google.maps.Marker(opts); 
    this.markerInstall(m); 
    ... 
} 

現在,由於markerInstall被稱爲用於分開每個標記(I上百個的實例),這會創建一個每個標記的閉包,閉包在應用程序結束之前不會被釋放(因爲它是由事件處理程序引用的)。我認爲這是一個問題,因爲它會消耗一些內存。 如何避免關閉並保持對象的通用性?或者我不應該打擾太多,因爲它不會消耗太多的內存?

+0

要downvoter - 請添加評論我的問題不清楚或沒有用處。 – TMS

+2

我不認爲你有什麼擔心。關閉中唯一的東西是「標記」參數。 – Pointy

回答

2

重要的是不同函數的數量,而不是每個函數都得到它自己的閉包。您可以移動「產生者」出來的功能產生它們,並使用一個參考,而不是

var map = (function() { // closure here to protect namespace from `listeners` 
    var listeners = { 
      'click': function(e) { 
        window.open('detail.php?id=' + this.my.id); 
       }, 
      'mouseover': function (e) {} 
     }; 
    return new Map3({ 
     markerInstall: function (marker) { 
      google.maps.event.addListener(marker, 'click', listeners['click']); 
      google.maps.event.addListener(marker, 'mouseover', listeners['mouseover']); 
     } 
    }); 
}()); 

因爲你沒有實際使用的任何數據,他們都完全生成處理這隻會工作已經一樣。

+1

沒有理由寫'監聽器['click']' - 'listeners.click'工作得很好。 – Pointy

+0

我沒有得到你的評論*「這隻會工作,因爲你實際上沒有使用任何數據來生成它們,所以它們都完全一樣。」*你現在怎麼樣?你有沒有在我的代碼中看到'...'?我沒有提供我所有的代碼,因爲它對於這個問題並不重要。當然,我使用'data [i]'來生成標記。 – TMS

+1

@Tomas您在'markerInstall'級沒有'var'任何東西,上面的任何東西仍然會被共享,並且處理程序內部的任何東西都是相同的,'this'在上下文中改變,'_event_上的'e.target' 。 –

相關問題