gpt4 book ai didi

javascript - 垃圾收集和 JavaScript "delete": Is this overkill/obfuscation, 还是一个好的做法?

转载 作者:IT王子 更新时间:2023-10-28 23:30:30 25 4
gpt4 key购买 nike

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

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

Use delete statements. Whenever you create an object using a new statement, pair it with a delete statement. This ensures that all of the memory associated with the object, including its property name, is available for garbage collection.

我总是花时间跟上最佳实践,尤其是如果我可以减少脚本的内存占用。所以我去测试一些东西。如果我理解正确的话,下面是一个对象在调用方法后自行删除的例子。

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

代码可以以任何方式工作。

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

最佳答案

首先声明 delete new scoped_object().init(); 并没有真正做任何事情,您最好注意哪些变量保留在闭包中,或者您是否有循环引用,哪些是 memory leaks 的最常见来源.

delete 运算符旨在用于删除对象属性,它真的被误解了,您引用@Noldorin 的答案引用 Apple JavaScript "Best Practices" 的一些文本,但是他们对 delete 的工作原理一无所知!!。

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

此外,尝试删除对绑定(bind)到环境记录的标识符的引用 - 使用 VariableDeclarationFunctionDeclaration 声明的标识符或从函数的 FormalParameterList-,导致新的 ECMAScript 5th Edition 上出现 SyntaxError 异常在 Strict Mode 下.

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

关于javascript - 垃圾收集和 JavaScript "delete": Is this overkill/obfuscation, 还是一个好的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3788805/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com