JavaScript对象:销毁它们

时间:2010-01-18 12:12:37

标签: javascript memory object

我必须维护一个包含30-40个属性的JavaScript对象,我每隔几秒就会更新一次。我已经读过在JavaScript中没有“释放”内存,浏览器会自动垃圾收集未使用的内存。

我的问题是:是否足以将对象本身设置为null,或者我是否需要将其所有属性设置为null然后将其设置为null?

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 个答案:

答案 0 :(得分:2)

在至少有一个引用它们之前,不会对变量进行垃圾回收。但是,请注意全局变量在“无处不在”中是可见的,有时可能无法收集垃圾,因为它们仍然可以从某个地方看到。

例如,你有

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 :(得分:1)

只有在无法再访问对象时才能收集该对象。您可以通过将引用该对象的所有局部变量设置为null(任何其他值也可以)以及删除(或覆盖)引用它的其他对象的任何属性来实现此目的。

删除对象自己的属性或明确地将它们设置为null将不会在这方面获得任何东西:如果对象的引用本身不是,则不会被视为“活着”。

答案 2 :(得分:1)

我需要将项目设置为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);

答案 3 :(得分:0)

将属性设置为null是不必要的。存储在属性中的任何值都将被垃圾回收器释放。作为替代方案,delete运算符可能会迫使立即销毁:

delete obj;