2013-07-04 7 views
0

Я реализую одностраничное приложение.Очистка Javascript из памяти после загрузки AJAX

У меня есть контейнер div (<div id="container"/>), где я загружаю html-контент, используя AJAX.

// 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
  • Variable viewModel - это просто ссылка на объект. После того, как вы установили viewModel в null, объект, на который ссылается, становится доступным для сбора мусора (т. Е. Становится неактивным), если у вас нет других ссылок на объект.
  • Закрытие удерживает объекты в памяти только до тех пор, пока функция владельца не будет запущена. Другими словами, Closure начинает ссылаться на свои объекты в начале и выпускает ссылки в конце. Что касается функции addPhone, это означает, что практически она не сохраняет объект viewModel в памяти.

Я бы рекомендовал использовать профилировщик Chrome, чтобы проверить это и любые другие проблемы с утечкой памяти. Вы можете взять снимок памяти и посмотреть на каждый объект, который держит его в памяти.