Объекты JavaScript: их уничтожение - PullRequest
5 голосов
/ 18 января 2010

Мне нужно поддерживать объект JavaScript с 30-40 свойствами, которые я обновляю каждые несколько секунд. Я читал, что в JavaScript нет такой вещи, как «освобождение» памяти, и браузер автоматически собирает неиспользуемую память мусором.

Мой вопрос: достаточно ли установить сам объект на ноль или мне нужно установить все его свойства на нуль, а затем установить его на ноль?

var obj = [];
obj[prop1] = "123";
obj[prop2] = "456"; 
//...and so on...

// now to release the obj, is it enough if I just did:
obj = null; 

Ответы [ 4 ]

2 голосов
/ 18 января 2010

Переменные не удаляются сборщиком мусора, пока на них нет хотя бы одной ссылки. Однако имейте в виду, что глобальные переменные видны «везде» и иногда могут не собирать мусор, потому что они все еще видны откуда-то.

Например, у вас есть

var a = {"testkey": "testval"};

var b = jQuery.ajax({
   url:"http://somewhere",
   method: "GET",
   onSuccess: function() {
      //this function is called asynchronously, moments later,
      //but as "a" is defined in the enclosing variable scope,
      //you can access it from here
      alert(a.testkey);
   }
});

Поэтому я бы согласился установить значение null после того, как вы закончили с вашим объектом.

1 голос
/ 18 января 2010

Объект можно собрать, только если он более недоступен. Вы можете достичь этого, установив для всех локальных переменных, которые ссылаются на объект, значение null (любое другое значение также подойдет) и удалив (или переписав) любые свойства других объектов, которые ссылаются на него.

Удаление собственных свойств объекта или явное присвоение им значения null ничего не даст в этом отношении: ссылки на объект не будут считаться «живыми», если они сами по себе не существуют.

1 голос
/ 18 января 2010

Единственный раз (я могу думать), когда вам нужно было бы установить элементы на null, это несколько случаев, когда задействован DOM.

Например, если у вас есть узел с несколькими дочерними узлами, каждый из которых имеет обработчик onclick, определенный анонимными функциями, то установка каждого onclick в null будет хорошей идеей (чтобы избежать непреднамеренных циклических ссылок).

<div id="delete_me">
  <span></span>
  <span></span>
</div>

var theDiv = document.getElementById('delete_me');
for (var i=0; i < theDiv.childNodes.length; i++) {
  theDiv.childNodes[i].onclick = function () {
    // stuff
  };
}

// Later...
// Delete stuff.
var divToDelete = document.getElementById('delete_me');

// Remove all the onclicks
for (var i=0; i < theDiv.childNodes.length; i++) {
  theDiv.childNodes[i].onclick = null;
}

// Delete the div
divToDelete.parentNode.removeChild(divToDelete);
0 голосов
/ 18 января 2010

Установка нулевых свойств не требуется. Любые значения, хранящиеся в свойствах, будут освобождены сборщиком мусора. В качестве альтернативы оператор delete может вызвать немедленное уничтожение:

delete obj;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...