Полное удаление созданной JS-функции с освобождением памяти в DOM. Есть ли реально рабочий код?
Всем привет.
Делаю свой фреймворк.
Вот нужен такой функционал по выгрузке функций из памяти, но посмотрев в интернете - не нашёл ответа, что это можно делать как-то в принципе.
Все пишут, что можно только подменить функцию на "пустышку" window.foo=function(){}. Но это - не вариант, т.к. не освобождает память.
Может кто сталкивался уже с подобной задачей?
Поделитесь, пожалуйста.
window.foo=function(){}
Нет. Вы перезаписали функцию delete window.fo;
Вот теперь вы удалили ссылку на функцию.
А дальше сборщик мусора сделает сам освобождение памяти. Этот процесс автоматический.
xmoonlight, да. Ссылка сохранилась.
Сделав тесты понял, что пока в коде есть ссылка(упоминание) на вызов функции - сборщик её не удалит.
Т. е. если вы где-то попытались удалить функцию, а через какое-то время её вызвали - сборщик мусора не удалит ссылку.
Хотя если в консоли писать поэтапно - ссылка удалиться. Ибо интерпретатор не знает, что вы введёте в консоль.
Из этого получается вопрос, что именно вы хотите получить на выходе?
PS:
Когда-то на Flash мы могли убить только объекты. С функциями было сложнее.
ProjectSoft, почти как у меня, только у меня с условием... foo=(delete foo.__proto__)?undefined:foo;
Но не уверен в том, что это корректно. Поэтому и задал вопрос...
xmoonlight, а почему не корректно?
Всё правильно. Переопределение функции. Старое значение функции (переменной) будет удалено в последствии и это правильно, т. к. объект/функция больше не доступны после переопределения и, соответственно, будут удалены.
xmoonlight, ну так запустите бесконечный цикл. Откройте профайлер и смотрим.)))
Хотя от Chromenium и так в ужасе в плане употретбления памяти в общей сложности.... что зависания Flash от рукожопости разработчика приложения, просто детский лепет.
HTML5 и всё иже с ним просто пропиарен и все дружно похоронили хорошую технологию. Adobe не обиделся и все смотрим, что происходит на самом деле. Иной раз просто нельзя держать десять вкладок открытыми, ибо видюха загружена по полной по 3D.
ProjectSoft, вот я и рою как могу тем, что дали.... )) Ладно, буду гонять тогда бесконечные циклы) Делать - нечего! ))
Но сразу настроен на худшее...)
Я тоже кодил на AS3. Славные времена были... Эх....
xmoonlight, а я то думаю, что же это за пытливый ум, который вдруг!!! заботится о памяти в JS )))
Ну тогда мне не придётся объяснять про профайлер, как это было в FD )))
ProjectSoft, Мне кажется при отсутствии прототипа и определения (undefined), если даже есть дальше вызов - оно должно всё равно очищать сразу же...
Т.е., вопрос: что является ссылкой (или флагом её наличия) для чистильщика, чтобы просто менять флаг.
__proto__ и undefined - это просто моя догадка, которая как-то сработала) Но так - не должно быть!)))
xmoonlight, не не. Сразу не будет. Это процесс автоматический. Т. е. если мы присвоили undefined - сборщик ещё будет его держать и очистит только при следующем проходе. Если бы он бегал постоянно - ловили бы подвисания всегда. Во Flash сборщик тоже не бежал сразу, если удаляется объект или мы вызывали его непосредственно. Мы просто указывали первоочерёдность удаления/проверки, что вот мы его явно удаляем и он нам не нужен, но ни как его непосредственный вызов.
А с чего ты взял, что он должен удалить именно в тот момент, если ссылка используется ниже по коду? GC так не работает, он смотрит везде, если нет ссылок, то чистит.
xmoonlight, на пальцах считай ссылки. Вот в твоем случае, если сделать foo = null, то на твою функцию на останется ссылок, и она потом удалится, когда это произойдет решает GC.