代码之家  ›  专栏  ›  技术社区  ›  Stephen

垃圾收集和javascript“删除”:这是一个过度杀戮/模糊,还是一个好的实践?

  •  15
  • Stephen  · 技术社区  · 16 年前

    我刚刚读了这个问题和公认的答案: What is JavaScript garbage collection?

    在答案中, Noldorin 参考了苹果公司的一些指导方针。以下是我关注的部分:

    使用DELETE语句。每当使用新语句创建对象时,请将其与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 回复  |  直到 11 年前
        1
  •  37
  •   John Raymund    15 年前

    首先是声明 delete new scoped_object().init(); 不是真的在做任何事情,您应该更好地注意哪些变量保持在闭包中,或者如果您有循环引用,这是最常见的 memory leaks .

    这个 delete 操作员应该习惯于 删除对象属性 是的。 真正地 误会了,您引用@noldorin的答案引用了 Apple JavaScript "Best Practices" 但是 他们一点也不知道 关于如何 删除 作品!!

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

    此外,试图 删除 对绑定到环境记录的标识符的引用-用 VariableDeclaration , FunctionDeclaration 或者从函数的 FormalParameterList -,导致 SyntaxError 新的例外 ECMAScript 5th Edition 在下面 Strict Mode .

    我建议你阅读以下关于 删除 :