сборка мусора для JavaScript - PullRequest
       25

сборка мусора для JavaScript

2 голосов
/ 14 октября 2010

У меня есть два примера кода 1

(function(){

var x = 1;

 this.getx = function() { return x; };

})();

sample 2

(function(){

var x = 1;

 this.getx = function() { };

})();

оба примера кода создают замыкание, x в первом примере ссылается на, хотя x во втором примере не упоминается, я знаю, что x в первом примере не будет сборщиком мусора, мой вопрос: будет ли x во втором примере собирать мусор?

Ответы [ 3 ]

1 голос
/ 14 октября 2010

Стандарт ECMAScript намеренно ничего не говорит о том, как должен работать сборщик мусора, поэтому реализации могут отличаться.Однако, как правило, если объект не является ссылочным от живого объекта, он будет собран.

В примере 2 это означает, что замыкание, скорее всего, будет собрано, но, вероятно, замыкание даже не будет создано.так как функция не ссылается на него.Замыкания являются дорогостоящими, и современные движки JavaScript стараются не создавать их, если их не заставляют.

0 голосов
/ 12 июля 2012

Для современных браузеров x во втором примере будет собирать мусор в большинстве браузеров, кроме ie6

0 голосов
/ 14 октября 2010

Сборка мусора в Javascript - это туманная вещь.Вообще говоря, вы можете предположить (хотя мы знаем, что подразумевается под этим), что как только не будет ссылок на переменную (например, когда она выйдет из области видимости), она будет собираться мусором.Однако ваши замыкания не будут работать так, как вы собираетесь, потому что они ни к чему не привязаны;таким образом, у вас не будет объекта функции для вызова getx().Однако, если бы вы присвоили его, x никогда бы не вышел за рамки, если бы вы не использовали ключевое слово delete для любых переменных, содержащих ссылку на функцию.

Простое правило: используйте оператор delete всякий раз, когдавы беспокоитесь о коллекции - это удалит ссылку, и более вероятно, что память будет освобождена.

Редактирование: комментарии @chuckj в стороне, используете ли вы delete или присваиваете переменную undefined по-прежнему соответствует точке, в которой вы хотите установить счетчик ссылок на 0, если есть надежда на освобождение памяти.

...