释放Javascript对象使用的内存

5

我需要自己释放已分配的内存,还是有一种垃圾回收器?

在JavaScript中使用以下代码是否可以?

function fillArray()
{
  var c = new Array;
  c.push(3);
  c.push(2);
  return c;
}

var arr = fillArray();
var d = arr.pop()

谢谢


在这个例子中,你想要做什么? - Gumbo
3个回答

8
引用自Apple JavaScript编码指南

使用删除语句。每当您使用new语句创建一个对象时,请配对使用delete语句。这可以确保与对象相关联的所有内存(包括其属性名称)都可供垃圾回收使用。有关delete语句的更多信息,请参见“释放对象”。

这意味着当您完成使用数组时,应使用delete命令以允许垃圾回收器释放为其分配的内存。值得注意的是,delete语句仅删除引用,这与C / C ++中的行为不同,因为那里没有垃圾回收,delete会立即释放内存。

3
请注意,“delete”运算符并不实际“删除”一个对象,它只是删除了对该对象的引用,以便JavaScript的垃圾回收器可以轻松地识别该对象不再使用。有关更多信息,请参见以下问题:https://dev59.com/aXRB5IYBdhLWcg3wCjcV。 - Steve Harrison
delete 运算符从对象中删除一个属性,因此不能用于变量。https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/delete - Alex Mund

3
JavaScript中的内存管理是自动的,有一个垃圾回收器(GC)。
您无法明确删除变量d和arr,但可以通过将变量设置为其他值(例如null)来删除对其值的引用,以允许GC将它们从内存中删除。
参考链接:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management
arr = null;
d = null;

请注意,delete关键字仅删除对象属性。

3
变量arrd将作为全局变量存在,并一直存在,直到被垃圾回收器收集。
这些变量将被设置为全局对象的属性,即在浏览器环境下是window,但由于它们是用var声明的,它们将无法从全局对象中删除。 在您的特定情况下,最好的做法可能是在完成使用后将变量赋值为null。您还可以考虑将其范围限制在一个函数内,并在该函数内执行所需操作。

这是错误的。变量arrd不是对象的属性,它们是变量,因此不能使用delete关键字进行“删除”。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete - Alex Mund
我建议将它们分配给其他变量。arr = null; d = null; - Alex Mund
@AlexJM 可能陷入了这个陷阱 - http://perfectionkills.com/understanding-delete/#firebug_confusion。很高兴更新答案,感谢指出! - Russ Cam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接