Освобождение объекта JavaScript

Я рассматриваю пример из http://www.javascriptkit.com/javatutors/oopjs.shtml

var person = new Object()
person.name = "Tim Scarfe"
person.height = "6Ft"

Но не упоминается, как "освободить" его, чтобы избежать утечки памяти.

Будет ли этот код освобожден?

person = null;
  • Как вы освобождаете объект JavaScript с помощью "new Object()?
  • Как вы освобождаете массив JavaScript, выделенный с помощью "new Array (10)"?
  • Как вы освобождаете JavaScript JSON, выделенный с помощью "var json = {" width ": 480," height ": 640}"?

Заранее благодарим за помощь.

Ответы

Ответ 1

Вам не нужно явно "освобождать" объекты JavaScript. JavaScript - это собранный мусором язык.

Что вы можете сделать, так это убедиться, что ничто не ссылается на память, которую вы больше не используете, поскольку память, на которую ссылаются, не может быть выпущена. Почти все время это происходит автоматически. Например:

function foo() {
   var a = [1, 2, 3, 4, 5, 6];

   // Do something
}

Память, выделенная указанному массиву a, имеет право на восстановление после того, как будет возвращена foo, потому что она больше не ссылается ни на что (a, выйдя из области видимости, и ничего не имеет ссылки на нее).

Напротив:

function foo() {
   var a = [1, 2, 3, 4, 5, 6];

   document.getElementById('foo').onclick = function() {
       alert("You clicked foo!");
   };
}

Теперь память, на которую указывает a, не может быть восстановлена, потому что есть закрытие (функция обработчика события), которая имеет активную ссылку на нее, и там что-то удерживает закрытие в памяти (элемент DOM). (Да, замыкание имеет ссылку на a [косвенный], хотя a не появляется нигде в закрытии, подробности о том, как работают замыкания и их влияние на сборку мусора здесь, в Closures не сложны.) Если я знаю, что массив не будет использоваться, я могу освободить память для массива:

function foo() {
   var a = [1, 2, 3, 4, 5, 6];

   document.getElementById('foo').onclick = function() {
       alert("You clicked foo!");
   };

   a = undefined;
}

Теперь, хотя a все еще существует, он больше не ссылается на массив, поэтому память массива может быть исправлена.

Подробнее в fooobar.com/questions/2573/....


Обновление. Возможно, я должен был упомянуть delete, хотя это не относится к точному коду в вашем вопросе.

Если вы привыкли к некоторым другим языкам, вы можете подумать: "Ах, delete является эквивалентом new", но на самом деле эти два абсолютно не имеют ничего общего друг с другом.

delete используется для удаления свойств объектов. Это не относится к вашему образцу кода по той простой причине, что вы не можете удалить var s. Но это не значит, что это не относится к другому коду, с которым вы можете столкнуться.

Рассмотрим два бита кода, которые, похоже, делают в основном одно и то же:

var a = {};         // {} is the same as new Object()
a.prop = "foo";     // Now `a` has a property called `prop`, with the value "foo"
a.prop = undefined; // Now `a` has a property called `prop`, with the value `undefined`

против.

var b = {};         // Another blank object
b.prop = "foo";     // Now `b` has a property called `prop`, with the value "foo"
delete b.prop;      // Now `b` has *NO* property called `prop`, at all

Оба из них делают память, что prop указывает на право на сбор мусора, но есть разница: в первом примере мы не удалили свойство, но мы установили его значение в undefined, Во втором примере мы полностью удалили свойство из объекта. Это не различие без разницы:

alert("prop" in a); // "true"
alert("prop" in b); // "false"

Но это относится к вашему вопросу в том смысле, что удаление свойства означает, что любая память, на которую указывает свойство, становится доступной для ремаркирования.

Итак, почему не применяется delete к вашему коду? Поскольку ваш person:

var person;

Переменные, объявленные с помощью var, являются свойствами объекта, но они не могут быть delete d. ( "Они являются объектами объекта?" Я слышал, что вы говорите "Да". Если у вас есть var в глобальной области видимости, он становится свойством глобального объекта [window, в браузерах]. var в области функций он становится свойством объекта invisible — но очень реального — называемого "переменным объектом", который использовался для этого вызова этой функции. Однако в любом случае вы не можете удалить ' em. Подробнее об этом в ссылка выше о закрытии.)

Ответ 2

JavaScript делает это все для вас, но если вы хотите явно освободить объект или переменную, то да, установив его в null, вы будете ближе всего к этому.