Сбор мусора и 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: