Подтвердить что ты не робот

Что делает backbone.js с моделями, которые больше не используются?

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

JavaScript в целом:

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

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

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

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

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

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

DOM (Document Object Model - 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

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

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