Сбор мусора и JavaScript "удалить": Является ли это излишним/обфускацией или хорошей практикой?
Я только что прочитал этот вопрос и принятый ответ: Что такое сборка мусора JavaScript?
В ответе Noldorin указаны некоторые рекомендации Apple. Вот часть, которую я интересую:
Используйте инструкции delete. Всякий раз, когда вы создаете объект, используя новый оператор, соедините его с инструкцией delete. Это гарантирует, что вся память, связанная с объектом, включая его имя свойства, доступна для сбора мусора.
Я всегда уделяю много времени, чтобы поддерживать передовые методы, особенно если я могу уменьшить объем памяти моих сценариев. Поэтому я пошел, чтобы проверить некоторые вещи. Если я правильно понимаю, ниже приведен пример объекта, который удаляет себя после вызова метода.
var thing = function () {
var a_method, and_another;
a_method = function() { /* do stuff */ };
and_another = function() { /* do some other stuff*/ };
this.init = function() { a_method(); and_another(); };
};
delete new thing().init();
Обычно я обернуваю все в функцию self-invoking и передаю свои глобальные переменные, как описано выше. Все то же самое, что я обычно делал, только разница заключалась в том, что я добавил delete
прямо перед new
.
Код работает в любом случае.
Итак, вопрос: я что-то здесь делаю? Есть ли какая-то польза для удаления ссылки на объект, который существует только внутри области функций? Или я просто заставляю вещи выглядеть запутанными?
Ответы
Ответ 1
Прежде всего утверждение delete new scoped_object().init();
на самом деле ничего не делает, вам лучше позаботиться о том, какие переменные остаются в закрытии или если у вас есть циклические ссылки, которые являются наиболее распространенным источником утечки памяти.
Оператор delete
предназначен для удаления свойств объекта, а его значение действительно неверно, ответ, который вы цитируете из @Noldorin, цитирует какой-то текст Apple JavaScript "Лучшие практики" , но они не имеют понятия о том, как работает delete
!
Они даже рекомендуют использовать delete
для ссылок на переменные, и это невозможно - возможно только для переменных, объявленных в Eval Code, потому что оператор var
объявляет переменную как не подлежащую удалению ({DontDelete}
в ECMAScript 3, или [[Configurable]] = false
в ECMAScript 5) свойства объектов Object Variable Object, которые образуют цепочку областей видимости -.
Кроме того, попытка delete
ссылки на идентификатор, привязанный к записи среды - идентификатор, объявленный с помощью VariableDeclaration
, FunctionDeclaration
или из функции FormalParameterList
-, вызывает исключение SyntaxError
на новый ECMAScript 5th Edition под Строгий режим.
Я бы порекомендовал вам прочитать следующую статью о delete
: