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