垃圾回收和JavaScript中的“delete”:这是过度杀伤/混淆,还是一个好的实践?

19 浏览
0 Comments

垃圾回收和JavaScript中的“delete”:这是过度杀伤/混淆,还是一个好的实践?

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

在答案中,Noldorin引用了一些来自Apple的指南。这是我关心的部分:

使用delete语句。每当您使用new语句创建一个对象时,请将其与一个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();

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

这段代码两种方式都可以工作。

所以问题是:我在这里做任何事情吗?从函数范围内部在引用上删除一个对象的参考是否有益处?还是我只是让事情看起来很混乱?

admin 更改状态以发布 2023年5月22日
0
0 Comments

首先,语句`delete new scoped_object().init();`实际上什么也没有做,你最好要注意在闭包中仍然存在的变量或者是否存在循环引用,这些是内存泄漏最常见的原因。\n\n`delete`操作符的作用是用于删除对象属性,而它被认为是非常容易被误解的,你引用的@Noldorin的回答中引用了Apple JavaScript \"Best Practices\"一文的部分内容,但他们对`delete`如何工作并不了解!!\n\n他们甚至建议在变量引用上使用`delete`,但这是不可能的,只有在Eval Code中声明的变量才能使用- 因为`var`语句将变量声明为不可删除的(在ECMAScript 3中为`{DontDelete}`,在ECMAScript 5中为`[[Configurable]]=false`)变量对象的属性 - 这些对象形成了作用域链。\n\n此外,试图删除绑定到环境记录的标识符的引用-使用`VariableDeclaration`,`FunctionDeclaration`声明的标识符或从函数的`FormalParameterList`中声明的标识符-在新的ECMAScript 5th Edition下会引发语法错误异常,这是严格模式的表现。\n\n我建议你阅读以下关于`delete`的文章:\n\n

0