JavaScript对象: 如何销毁它们

5

我需要维护一个具有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; 

https://dev59.com/Z3RA5IYBdhLWcg3wsgBP - Eineki
4个回答

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
我能想到的唯一需要将项目设置为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);

1

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

删除对象自己的属性或显式将其设置为null在这方面不会带来任何好处:如果对象本身不存在,则不会考虑对象的引用是否“存活”。


0

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

delete obj;

2
“delete” 不会强制销毁对象,它只是从对象中删除属性;此外,局部变量不能被删除;在 ECMAScript 5 的严格模式下这样做甚至会导致语法错误。 - Christoph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接