Рискуя проголосовать за недоверие или рассказать мнение Я не уверен, как правильно обращаться с этой ситуацией, или если это даже имеет значение.Управление использованием памяти javascript на динамически загружаемых страницах
Я разрабатываю одностраничное веб-приложение, где все страницы, кроме главной страницы (с системой меню) загружаются динамически через ajax. Все библиотеки javascript, которые я использую (jquery, bootstrap, kendo и другие), загружаются на главной странице, а также в файлы application.js и css.
Каждая загружаемая мной страница требует наличия собственного javascript и имеет соответствующие файлы js с именем так же, как и файл html (для моего собственного здравомыслия). Когда страница загружается и устанавливается в элементе контента, запускается страница js, что отлично.
Вскоре я понял, что страница js добавляет любые переменные, которые она создает, к глобальному пространству javascript. В идеале при загрузке другой страницы эти переменные исчезнут, поэтому сборка мусора javascript может в конечном итоге вернуть эту память.
Чтобы облегчить это, я начал повторять использование одинаковых имен для общих структур, таких как модели просмотра kendo, поэтому при загрузке новой страницы он заменяет любые глобальные переменные с тем же именем.
В некоторых случаях, когда есть специализированные переменные, я устанавливаю их значения равными нулю, чтобы освободить память в глобальной функции загрузчика ajax.
Я рассматриваю возможность добавления функции release() на все страницы, которые это делают, и вызывать ее до того, как страница будет выгружена. Поскольку функция release является глобальной, и каждая страница переопределяет ее, вызывая ее перед заменой страницы, должна работать.
Мои вопросы:
это имеет значение? я должен заботиться о нескольких килограммах бара, который может быть оставлен.
Есть ли лучшие способы обращения с этим?
Что я сейчас делаю, даже эффективно? Является ли сборщик мусора javascript очищенным не привязанным к нему баром, как я думаю, что он делает?
Followup после ответа Джакомо в:
Джакомо ваша техника работает в том смысле, что функции страницы нормально и кендо переплеты имеют доступ к локальной переменной ViewModel, созданной в обычной страницы. Меня беспокоит, что я не знаю, как он работает. Я опустил var page = Page(); назначение и просто включить страницу(); в конце сценария (вне функции Page()), и, похоже, нет никаких отрицательных эффектов.
Как я вижу, скрипт запускается, когда страница установлена в html (div) этого родительского элемента, это определяет затем функцию Page(), которая создает все локальные переменные и виджеты/привязки кендо на странице, тогда он выпадает из сферы действия. Как только функция Page() завершится и закончится, и ничего не останется, однако созданная мной модель просмотра останется, потому что страница и привязка всей работы, события click, определенные в Page(), выполняются и т. Д. Итак, когда все это исчезнет? Будет ли он выделен, когда я заменю html родителя на новую страницу? Я не вижу, как ... конечно, независимо от того, что делает кендо, чтобы сохранить ссылку на viewmodel, кажется, что он жив, я не уверен, что он будет выпущен, когда страница исчезнет, что является моим целым намерением.
Возможно, что страница = новая страница(); имеет важное значение для процесса де-распределения ... но я не знаю, как это определить.
Возможное решение?
Может кто-то комментарий на сумму этого:
//enters here on ajax page load after inserted into DOM
var pageData = {
someData: 999,
someArray: ["one","two"],
functionOne: function(arg) {
//stuff
},
functionTwo: function(arg) {
//stuff
}
};
//do some work
pageData.functionOne(pageData.someData);
pageData.functionTwo("abc");
//called before page is removed from DOM
function releasePage() {
pageData = null;
}
//GC eventually cleans it up
Это интересно. Первоначальное тестирование с локально объявленным объектом kendo ui (используемым как viewmodel), связанным с элементами страницы, кажется, работает очень хорошо ... Однако могут быть ограничения, я думаю, что мне нужны некоторые функции, которые доступны на глобальном уровне, например функции обратного вызова, которые являются переданный внешнему коду, я перейду через существующую страницу и посмотрю, как это происходит. – kpg
Посмотрев на это довольно немного, я пришел к не обязательному выводу – kpg
. Посмотрев на это довольно немного, я пришел к необязательному правильному выводу, что самый верный способ сделать это - с моим предложением release(). Каждая страница определяет функцию release() (которая ничего не может сделать) и перед ее выгрузкой вызывается release(). Этот метод не может нанести вреда (скрещенными пальцами) и может установить переменные в нуль. Не уверен, что делать с функциями. Я не могу в это время проверить, что метод закрытия, предложенный Giacomo, фактически позволит вернуть память. Мне понадобится гораздо более простая тестовая платформа, и для этого лучше справиться с профилированием хрома. – kpg