JavaScript对象:销毁它们
我必须维护一个包含30-40个属性的JavaScript对象,每隔几秒钟更新一次。我读到JavaScript中没有“释放”内存这类东西,浏览器会自动垃圾收集未使用的内存 我的问题是:将对象本身设置为null就足够了,还是需要将其所有属性设置为null,然后再将其设置为nullJavaScript对象:销毁它们,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
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);
}
});