垃圾收集和JavaScript“删除”:这是过度/混淆,还是一种好的做法?

时间:2010-09-24 15:52:13

标签: javascript object memory garbage-collection

我刚刚阅读了这个问题和接受的答案:What is JavaScript garbage collection?

在答案中,Noldorin引用了Apple的一些指导原则。以下是我关注的部分:

  

使用删除语句。每当使用新语句创建对象时,请将其与delete语句配对。这可确保与对象关联的所有内存(包括其属性名称)都可用于垃圾回收。

我总是花时间跟上最佳实践的速度,特别是如果我可以减少脚本的内存占用。所以我开始测试一些东西。如果我理解正确,以下是在调用方法后删除自身的对象的示例。

var thing = function () {
    var a_method, and_another;
    a_method    = function() { /* do stuff */ };
    and_another = function() { /* do some other stuff*/ };
    this.init   = function() { a_method(); and_another(); };
};
delete new thing().init();

通常我会将所有内容都包装在一个自调用函数中,并像上面一样传入我的全局变量。一切都和我通常做的一样,唯一的区别是我在delete之前添加了new

代码可以正常工作。

所以问题是:我在这里做任何吗?删除对仅存在于函数范围内的对象的引用是否有某种好处?或者我只是让事情看起来令人困惑?

1 个答案:

答案 0 :(得分:37)

首先,语句delete new scoped_object().init();并没有真正做任何事情,你应该更好地关注哪些变量保持在闭包中,或者你是否有循环引用,这是memory leaks的最常见来源

delete运算符用于删除对象属性,并且真的被误解,你从@Noldorin引用的答案引用了一些文字Apple JavaScript "Best Practices",但他们没有关于delete如何运作的线索<​​/ em> !!

他们甚至建议在变量引用上使用delete,这是不可能的 - 只能在 Eval Code 中声明的变量 - ,因为var语句声明变量作为不可删除的(ECMAScript 3中的{DontDelete},或ECMAScript 5中的[[Configurable]] = false)构成范围链的变量对象 - 对象的属性 - 。

此外,尝试delete对绑定到环境记录的标识符的引用 - 使用VariableDeclarationFunctionDeclaration或函数FormalParameterList声明的标识符 - ,在ECMAScript 5th Edition下的新Strict Mode上导致SyntaxError例外。

我建议您阅读以下有关delete的文章: