【问题标题】:Javascript clearing objects from memory after AJAX loadJavascript 在 AJAX 加载后从内存中清除对象
【发布时间】:2013-07-04 15:31:33
【问题描述】:

我正在实现一个单页应用程序。

我有一个容器 div (<div id="container"/>),我在其中使用 AJAX 加载 html 内容。

// function that is overwritten by loadMenu functions
// and gets called before loading a new section 
function unbindPreviousSection() { };

// load contacts
function loadContactsMenu() {
    unbindPreviousSection();
    unbindPreviousSection = function () { };

    $.get("/Home/Contacts", function (data, status) {
        if (status === "success") {
            $("#content").html(data);
            contactsMenu.bind();
            unbindPreviousSection = contactsMenu.unbind;
        }
    });
};

// load profile
function loadProfileMenu() {
    unbindPreviousSection();
    unbindPreviousSection = function () { };

    $.get("/Home/Profile", function (data, status) {
        if (status === "success") {
            $("#content").html(data);
            unbindPreviousSection = function() {
                // specific unbind methods for this menu
            };
        }
    });
};

var contactsMenu = {};
(function () {
    var viewModel = null;

    contactsMenu.bind = function () {
        viewModel = {
            phones: ko.observableArray()
        };
    };

    contactsMenu.addPhone = function (phone) {
        viewModel.phones.push(phone);
    };

    contactsMenu.unbind = function () {
        viewModel = null;
    };
}());

在任何菜单加载函数中,我在内部调用上一个加载菜单的unbind 方法。

loadContactsMenu();
loadProfileMenu();  // internally calls contactsMenu.unbind();

在我加载任何数据之前,我调用unbindPreviousSection()函数来处理之前的菜单数据。

我的问题是:

在我调用contactsMenu.unbind() 后,contactsMenu 对象内的viewModel 变量是否仍然存在,即使我将其设置为空? (它会造成内存泄漏吗?)

contactsMenu.addPhone 函数是否创建了一个闭包,该闭包将viewModel 变量保存在内存中(因为在函数内部使用)?

【问题讨论】:

    标签: javascript performance memory-leaks


    【解决方案1】:
    • 变量 viewModel 只是对对象的引用。将 viewModel 设置为 null 后,它所引用的对象就可以进行垃圾回收(即变得不持久),除非您对该对象有其他引用。
    • 闭包仅在所有者函数运行之前将对象保存在内存中。换句话说,闭包在开始时开始引用它的对象,并在结束时释放引用。关于 addPhone 函数,这意味着它实际上不会将 viewModel 的对象保存在内存中。

    我建议使用 Chrome 分析器来检查此问题以及任何进一步的内存泄漏问题。您可以在那里拍摄内存快照,并查看每个将其保存在内存中的对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-25
      • 1970-01-01
      • 2011-04-28
      • 2011-07-04
      • 2011-02-22
      • 1970-01-01
      • 2013-04-28
      • 1970-01-01
      相关资源
      最近更新 更多