我在创建内存泄漏吗?

cap*_*gon 11 javascript memory-leaks

我有一个JavaScript闭包,我会在我的Web应用程序的整个生命周期中重新创建(单个完整的ajax页面).

我想知道它是否会造成内存泄漏.

这是一个JSFIDDLE示例

有问题的代码:

function CreateLinks() {

    var ul = $("<ul></ul>").appendTo('div#links');

    for (var i in myLinks) {

        var li = $('<li>' + myLinks[i].name + '</li>').appendTo(ul);

        //closure starts here
        (function (value) {
            li.click(function (e) {
                $('div#info').append('<label>' + value + '</label><br />');
                RecreateLinks();
            });
        })(myLinks[i].value);

    }
}
Run Code Online (Sandbox Code Playgroud)

Ja͢*_*͢ck 2

如果您确保避免click在函数中绑定多个处理程序,那么您应该没问题RecreateLinks();这可以通过显式解除现有节点的绑定、删除 DOM 节点或确保不会添加多个click处理程序来完成。

浏览器在内存分配策略方面做得越来越好,但您不应该假设太多。如果内存使用是一个大问题,请尽量避免创建太多您不确定它们是否会被垃圾收集的闭包。一种这样的方法是使用.data()存储值对象,然后使用通用点击处理程序而不是闭包。

分析 JavaScript 并不是那么简单;Chrome确实有一个Profile工具,可以监控CPU和数据性能。这可以让您很好地衡量预期的内存消耗,但 Chrome 并不是所有浏览器,请记住这一点。