2013-07-04 31 views
0

我正在实现单页面应用程序。Javascript在AJAX加载后从内存清除对象

我有一个容器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()功能配置上一级菜单数据。

我的问题是:

viewModel变量中contactsMenu对象仍然坚持我打电话contactsMenu.unbind()后,即使我将它设置为空? (是否会造成内存泄漏?)

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

回答

1
  • 变量viewModel只是对象的引用。在您将viewModel设置为null之后,它所引用的对象就有资格进行垃圾回收(即不会持久化),除非您有其他对该对象的引用。
  • 只有在所有者函数运行之前,闭包才将对象保存在内存中。换句话说,Closure在开始时引用它的对象,并在最后释放引用。关于addPhone函数,这意味着实际上它不会将viewModel的对象保留在内存中。

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