释放JavaScript对象

时间:2010-12-23 23:20:34

标签: javascript

我正在查看http://www.javascriptkit.com/javatutors/oopjs.shtml

中的示例
var person = new Object()
person.name = "Tim Scarfe"
person.height = "6Ft"

但是没有提及如何“释放”它以避免内存泄漏。

以下代码是否会释放它?

person = null;
  1. 如何使用“new Object()?
  2. 释放JavaScript对象
  3. 如何释放使用“new Array(10)”分配的JavaScript数组?
  4. 如何释放使用“var json = {”width“:480,”height“:640}分配的JavaScript JSON”?
  5. 提前感谢您的帮助。

2 个答案:

答案 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,但它不适用于您问题中的准确代码。

如果你已经习惯了其他一些语言,你可能会认为“啊,newdelete的对应物”,但事实上两者绝对没有没有到互相帮助。

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是您最接近这样做的。