Что делает backbone.js с моделями, которые больше не используются - PullRequest
20 голосов
/ 18 марта 2012

В последнее время я углубляюсь во все клиентские паттерны MVC / MVVM, и мне особенно интересен backbone.js.

Одна вещь, которую я не до конца понимаю, это то, что случилось смодели, когда они больше не нужны.

Допустим, у нас есть приложение, в котором есть пользователи и продукты.У нас есть пользовательские модели / виды и модели продуктов / виды

ПРИМЕЧАНИЕ: для простоты мы , а не пользователь .Мы можем просто CRUD пользователи / продукты.

Когда я захожу на страницу продуктов, я предполагаю, что мы загружаем модель и представление, соответствующее этому.

Что происходит, когда мы покидаем страницу и вводимстраница пользователей.Пользовательская модель / представление загружена, но продукты также все еще загружены.

Сохраняем ли мы их загруженными, заботится ли об этом магистраль или вам явно необходимо завершить определенные объекты.

Ответы [ 2 ]

26 голосов
/ 18 марта 2012

Backbone явно не обрабатывает очистку объектов для вас. Это 50/50 для вас и время выполнения JavaScript.

JavaScript - это язык для сборки мусора, такой как Java, C #, Ruby и другие. Основой языков сборки мусора является то, что объект, на который все еще ссылается ваше приложение, не будет очищен. В противовес этому, когда объект больше не ссылается на ваше приложение, он будет очищен.

JavaScript в целом:

Когда вы создаете переменную, вы можете использовать ее как локальную функцию или как глобальную переменную.

Глобальные переменные никогда не очищаются сборщиком мусора в течение жизни страницы. Единственный раз, когда они очищаются, это когда вы полностью оставляете HTML-страницу - переходите на другую страницу и заставляете браузер загружать новую страницу с сервера (выполняется полное обновление сервера) или закрываете браузер или вкладку браузера.

Переменные области действия функции очищаются, когда переменная выходит из области видимости, то есть когда функция вышла из системы и на нее больше нет ссылок. Есть несколько исключений из этого: возвращаемые значения и замыкания.

Возвращаемое значение сохраняется в вашем приложении путем присвоения возвращаемого значения другой переменной. Возвращаемое значение подпадает под те же общие правила, но переменная теперь находится в другой функции. Как только эта переменная выходит из области видимости, ее можно очистить.

Закрытие позволяет родительской области предоставлять значения, к которым может иметь доступ дочерняя область. Когда очищается область потомка, закрытой переменной родителя может быть разрешено очищаться (при условии, что больше ничего не удерживает ее).

Объекты с атрибутами и функциями подпадают под те же правила. Объект может ссылаться на другой объект или функцию, если ему назначен атрибут: myObj.foo = thatObj.

DOM (объектная модель документа - HTML-код в вашем приложении) - это объект JavaScript. События и другие ссылки на вашу DOM работают так же, как и любые другие ссылки. Если у вас есть объект, обрабатывающий событие DOM, он имеет ссылку в вашем приложении и не будет очищен сборщиком мусора. Если вы хотите, чтобы он был очищен, вы должны удалить все ссылки на него, включая ссылку на DOM из обработчика событий.

Очистка памяти

Общее правило: если вы загружаете данные в базовую коллекцию или объект и хотите, чтобы этот объект был очищен, чтобы он больше не использовал память, вы должны удалить все ссылки на этот объект. Это стандартное правило сборки мусора в JavaScript.

Вы не можете форсировать сборку мусора, но вы можете заставить переменную отменять ссылку на то, на что она указывает, используя ключевое слово delete в JavaScript: delete myVar

Магистральные

Backbone - это JavaScript, поэтому он подчиняется тем же правилам. Есть несколько интересных применений замыканий и ссылок в Backbone, о которых вам необходимо знать, что поможет вам узнать, когда вам нужно вручную очистить некоторые объекты.

Например: события. Четный метод обработчика / обратного вызова работает, имея ссылку между объектом, который вызывает событие, и обратным вызовом, который обрабатывает событие. Это одно из самых простых мест, вызывающих утечки памяти в приложении Backbone, и я подробно его обсуждаю здесь: http://lostechies.com/derickbailey/2011/09/15/zombies-run-managing-page-transitions-in-backbone-apps/

Кроме понимания того, как события работают в терминах ссылок, просто следуйте стандартным правилам управления памятью в JavaScript, и все будет в порядке. Как только вы удалите все ссылки на эту коллекцию объектов User, они будут очищены.

2 голосов
/ 13 ноября 2013

Обратите внимание, что если вы console.log() ваша модель (по крайней мере, в Chrome), она останется в памяти, потому что консоль имеет ссылку на нее.

Я разозлился из-за этого.Если вы видите утечку памяти, попробуйте очистить консоль и снова запустить свой профиль.Если у тебя была та же проблема, что и у меня, то она исчезла:)

...