Сборка мусора и JavaScript «delete»: это перебор / запутывание или хорошая практика? - PullRequest
15 голосов
/ 24 сентября 2010

Я только что прочитал этот вопрос и принял ответ: Что такое сборка мусора в JavaScript?

В ответе Noldorin ссылается на некоторые рекомендации Apple.Вот часть, которая меня интересует:

Используйте операторы 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();

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

Код работает в любом случае.

Так что вопросэто: я делаю что-нибудь здесь?Есть ли какая-то польза от удаления ссылки на объект, который существует только внутри области действия функции?Или я просто заставляю вещи выглядеть запутанными?

1 Ответ

37 голосов
/ 24 сентября 2010

Прежде всего утверждение delete new scoped_object().init(); на самом деле ничего не делает, вам лучше позаботиться о том, какие переменные остаются закрытыми, или если у вас есть циклические ссылки, которые являются наиболее распространенным источником утечек памяти .

Оператор delete предназначен для удаления свойств объекта , и это действительно неправильно понято, ответ, который вы цитируете из @Noldorin, цитирует некоторыетекст Apple JavaScript "Best Practices" , но они не имеют понятия о том, как delete работает !!.

Они даже рекомендуют использовать delete для ссылок на переменные, и это невозможно - возможно только для переменных, объявленных в Eval Code -, потому что оператор var объявляет переменную как не удаляемую ({DontDelete} в ECMAScript 3, или[[Configurable]] = false в ECMAScript 5) свойства объектов-переменных, которые образуют цепочку областей действия.

Более того, попытка delete ссылки на идентификатор, который привязан к средешнур - идентификатор, объявленный с VariableDeclaration, FunctionDeclaration или из функции FormalParameterList -, вызывает исключение SyntaxError для нового ECMAScript 5-е издание в Строгий режим .

Я бы порекомендовал вам прочитать следующую статью о delete:

...