我刚刚阅读了这个问题和接受的答案: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
。
代码可以正常工作。
所以问题是:我在这里做任何吗?删除对仅存在于函数范围内的对象的引用是否有某种好处?或者我只是让事情看起来令人困惑?
答案 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
对绑定到环境记录的标识符的引用 - 使用VariableDeclaration
,FunctionDeclaration
或函数FormalParameterList
声明的标识符 - ,在ECMAScript 5th Edition下的新Strict Mode上导致SyntaxError
例外。
我建议您阅读以下有关delete
的文章: