javascript - 当您需要提供回调以安装事件处理程序时如何避免关闭

标签 javascript closures

我有一个对象 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/

相关文章:

javascript - 带有链接的褪色图像

javascript - 为什么Vue实例的数据没有更新

javascript - 误报 "Unreachable code detected.ts(7027)"?

swift - 作为参数传入的闭包是否分配给swift中的参数名称?

javascript - ajax运行后调用闭包函数

javascript - date-fns 中的 parse 函数返回前一天的值

javascript - 无法在 Firefox/Opera 中设置焦点

Scala本地返回?

javascript - 检索对象的所有实例中保存的值

javascript - 带有 Javascript 回调的闭包