2013-07-04 32 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瀏覽器來檢查此問題以及任何進一步的內存泄漏問題。您可以在那裏獲取內存快照,並查看每個將其保存在內存中的對象。