我有一个对象 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
分别为每个标记调用(我有数百个标记),这将为每个标记创建一个闭包,直到应用程序结束才会释放闭包(因为它被事件处理程序引用)。我认为这是一个问题,因为它会消耗一些内存。 我怎样才能避免闭包并使对象足够通用?或者我不应该太费心,因为它不会消耗那么多内存?
最佳答案
重要的是不同函数的数量,而不是每个函数都有自己的闭包。您可以将“生成的那些”移出生成它们的函数并改用引用
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']);
}
});
}());
这只会起作用,因为您实际上没有使用任何数据来生成处理程序,因此它们已经完全相同。
关于javascript - 当您需要提供回调以安装事件处理程序时如何避免关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22177231/