Ste*_*hen 15 javascript memory garbage-collection object
我刚读了这个问题和接受的答案: 什么是JavaScript垃圾收集?
在答案中,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();
Run Code Online (Sandbox Code Playgroud)
通常我会将所有内容都包装在一个自调用函数中,并像上面一样传入我的全局变量.一切都和我通常做的一样,唯一的区别是我在delete之前添加了权利new.
代码以任何一种方式工作.
所以问题是:我在这做什么吗?删除对仅存在于函数范围内的对象的引用是否有某种好处?或者我只是让事情看起来令人困惑?
CMS*_*CMS 37
首先,语句delete new scoped_object().init();并没有真正做任何事情,你应该更好地关注哪些变量保持在闭包状态,或者你是否有循环引用,这是最常见的内存泄漏源.
该delete经营者是指被用来删除对象的属性,它是真的误会了,你从@Noldorin引用答案引述的一些文本苹果JavaScript的"最佳做法",但他们没有一个线索如何delete作品! .
他们甚至建议delete在变量引用上使用,这对于Eval Code中var声明的变量是不可能的- 因为该语句将变量声明为不可删除({DontDelete}在ECMAScript 3中,或[[Configurable]] = false在ECMAScript 5中)变量对象的属性 -形成范围链的对象 - .
此外,试图delete以绑定到一个环境记录的标识符的参考-一个声明的标识符VariableDeclaration,FunctionDeclaration或从功能的FormalParameterList- ,导致SyntaxError在新的异常的ECMAScript第五版下严格模式.
我建议你阅读以下文章delete: