【问题标题】:JavaScript patterns and garbage collectionJavaScript 模式和垃圾收集
【发布时间】:2012-12-28 19:39:15
【问题描述】:

一段时间以来,我一直在使用两个版本的 JavaScript 模式,我从 Addy Osmani 那里学到了模块模式。 view it here

此模式的第一个版本使用对象字面量:

var x = {
  b: function() {
    return 'text';
  },
  c: function() {
    var h = this.b();
    h += ' for reading';
  }
}
alert(x.b()) // alerts text.

而其他版本使用自执行功能:

var y = (function() {
     var first = 'some value';
     var second = 'some other value';
     function concat() {
       return first += ' '+second;
     }

     return {
       setNewValue: function(userValue) {
         first = userValue;
       },
       showNewVal: function() {
         alert(concat());
       }
     }
})();

y.setNewValue('something else');
y.showNewVal();

鉴于上述示例,这两种模式中的任何一种(不考虑任何事件侦听器)是否对垃圾回收友好(鉴于它们引用自身的方式)?

【问题讨论】:

  • 我想是的。只要你没有任何指向这些对象的东西,它们就会有资格进行 gc(包括闭包)。
  • @bfavaretto 第一个会(当我使用它时)通常会像“this.c() 或 this.b()”一样引用它自己,可以自我引用防止主对象成为 GC会吗?
  • 我不是专家,但我不这么认为(尤其是因为this 是在 js 中的调用时间确定的)。

标签: javascript memory-management memory-leaks garbage-collection


【解决方案1】:

没有。至于什么时候变得无法访问,没有区别。

两者都使用将 API 固定到位的全局变量,因此在框架被卸载并从历史记录中删除之前将无法被收集。

第二个分配并保留一个额外的激活帧(对于模块本地 firstsecond),但这是一个非常小的成本。

【讨论】:

  • 所以从技术上讲,如果我要在“var x 或 var y”上使用“delete”关键字,比如“删除 x 或删除 y”,那么本质上会使其成为垃圾回收吗?跨度>
  • @zero,不。 delete window.x 会。 delete x 我认为是严格模式下的无操作或错误。
猜你喜欢
  • 1970-01-01
  • 2012-02-09
  • 2021-10-18
  • 1970-01-01
  • 1970-01-01
  • 2014-08-26
  • 2012-11-30
  • 2012-03-21
  • 2013-01-15
相关资源
最近更新 更多