我正在查看http://www.javascriptkit.com/javatutors/oopjs.shtml
中的示例var person = new Object()
person.name = "Tim Scarfe"
person.height = "6Ft"
但是没有提及如何“释放”它以避免内存泄漏。
以下代码是否会释放它?
person = null;
提前感谢您的帮助。
答案 0 :(得分:47)
您不必明确“释放”JavaScript对象。 JavaScript是一种垃圾收集语言。
可以做的是确保没有任何内容引用您不再使用的内存,因为无法释放正在引用的内存。几乎所有的时间都会自动发生。例如:
function foo() {
var a = [1, 2, 3, 4, 5, 6];
// Do something
}
分配给指向的数组a
的内存有资格在foo
返回后被回收,因为它不再被任何内容引用(a
已超出范围而没有任何内容一个杰出的参考)。
相反:
function foo() {
var a = [1, 2, 3, 4, 5, 6];
document.getElementById('foo').onclick = function() {
alert("You clicked foo!");
};
}
现在,a
指向的内存无法回收,因为有一个闭包(事件处理函数),它有一个活动的引用,并且有一些东西将闭包保留在内存中(DOM元素) 。 (是的,闭包有a
[间接的]引用,即使a
没有出现在闭包中的任何地方;关于闭包如何工作的详细信息及其对垃圾收集的影响function foo() {
var a = [1, 2, 3, 4, 5, 6];
document.getElementById('foo').onclick = function() {
alert("You clicked foo!");
};
a = undefined;
}
3}}。)如果我知道不会使用该数组,我可以释放该数组的内存:
a
现在,虽然delete
仍然存在,但它不再引用数组,因此可以回收数组的内存。
更多Closures are not complicated。
更新:我可能应该提到delete
,但它不适用于您问题中的准确代码。
如果你已经习惯了其他一些语言,你可能会认为“啊,new
是delete
的对应物”,但事实上两者绝对没有没有到互相帮助。
var
用于从对象中删除属性。它不适用于您的代码示例,原因很简单,您无法删除var a = {}; // {} is the same as new Object()
a.prop = "foo"; // Now `a` has a property called `prop`, with the value "foo"
a.prop = undefined; // Now `a` has a property called `prop`, with the value `undefined`
。但这并不意味着它与您可能遇到的其他代码无关。
让我们考虑两段似乎完全相同的代码:
var b = {}; // Another blank object
b.prop = "foo"; // Now `b` has a property called `prop`, with the value "foo"
delete b.prop; // Now `b` has *NO* property called `prop`, at all
VS
prop
这两个都使undefined
指向的内存符合垃圾收集的条件,但是有区别:在第一个示例中,我们没有删除该属性,但我们将其值设置为{ {1}}。在第二个示例中,我们已从对象中完全删除了该属性。这不是没有区别的区别:
alert("prop" in a); // "true"
alert("prop" in b); // "false"
但这适用于您的问题,因为删除属性意味着属性所指向的任何内存都可用于回收。
那么为什么delete
不适用于您的代码?因为您的person
是:
var person;
使用var
声明的变量是对象的属性,但它们不能是delete
d。 (“它们是对象的属性?”我听到你说。是的。如果你在全局范围内有var
,它将成为全局对象[window
在浏览器中的属性]。如果你在函数范围内有一个var
,它就会成为一个不可见但非常真实的对象 - 被称为“变量对象”的对象,用于对该函数的调用。不管怎么说,你不能删除'em。关于闭包的更多信息。{/ 3}}。
答案 1 :(得分:1)
JavaScript会为您完成这一切,但是如果您想明确释放一个对象或变量,那么将其设置为null
是您最接近这样做的。