JavaScript对象:销毁它们

JavaScript对象:销毁它们,javascript,memory,object,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 enou

我必须维护一个包含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; 

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

delete obj;

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

删除对象自己的属性或显式地将它们设置为
null
在这方面不会给您带来任何好处:如果对象本身不是活动的,那么对象的引用就不会被认为是“活动的”。

唯一需要将项设置为
null
的情况是涉及DOM的少数情况

例如,如果一个节点有几个子节点,每个子节点都有一个由匿名函数定义的onclick处理程序,那么将每个onclick设置为
null
将是一个好主意(以避免无意的循环引用)


var theDiv=document.getElementById('delete_me');
对于(var i=0;i
变量在至少有一个引用之前不会被垃圾收集。但是,请注意,全局变量在“任何地方”都是可见的,有时可能不会被垃圾收集,因为它们仍然在某处可见

例如,你有

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

delete
不会强制销毁对象-它会从对象中删除属性;此外,局部变量不能被删除;在严格模式ECMAScript 5中,这样做甚至是语法错误
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);
   }
});