Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript模式和垃圾收集_Javascript_Memory Management_Memory Leaks_Garbage Collection - Fatal编程技术网

JavaScript模式和垃圾收集

JavaScript模式和垃圾收集,javascript,memory-management,memory-leaks,garbage-collection,Javascript,Memory Management,Memory Leaks,Garbage Collection,一段时间以来,我一直在使用两个版本的JavaScript模式,这是我从Addy Osmani那里学到的,称为模块模式 此模式的第一个版本使用对象文字: var x = { b: function() { return 'text'; }, c: function() { var h = this.b(); h += ' for reading'; } } alert(x.b()) // alerts text. 而另一个版本使用自动执行功能: var y

一段时间以来,我一直在使用两个版本的JavaScript模式,这是我从Addy Osmani那里学到的,称为模块模式

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

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();

在上面的例子中,这两种模式(不考虑任何事件侦听器)中的任何一种都是垃圾收集友好型的(考虑到它们引用自身的方式)?

否。当发生错误时无法访问的内容没有区别

两者都使用一个全局变量将API固定在适当的位置,因此在卸载帧并从历史记录中删除该帧之前将无法收集


第二个模块分配并保留一个额外的激活框架(对于模块本地人
第一个
第二个
),但这是一个相当小的成本。

不。当发生错误时,无法达到的部分没有区别

两者都使用一个全局变量将API固定在适当的位置,因此在卸载帧并从历史记录中删除该帧之前将无法收集


第二个分配并保留一个额外的激活框架(对于模块本地人
第一个
第二个
),但这是一个相当小的成本。

我认为是这样。当你没有任何东西指向这些对象时,它们就有资格被gc(包括闭包)。@bfavaretto第一个对象(当我使用它时)通常会引用它自己,就像“this.c()或this.b()”自我引用可以防止主对象被gc调用吗?我不是专家,但我也不这么认为(特别是因为
这个
在js中是根据调用时间确定的)。我认为是这样的。每当你没有任何东西指向这些对象时,它们就有资格使用gc(包括闭包)。@bFavareto第一个对象(当我使用它时)通常会引用它自己,就像“this.c()或this.b()”自引用可以防止主对象被GC’d吗?我不是专家,但我也不这么认为(特别是因为
这个
在js中是根据调用时间确定的)。所以从技术上讲,如果我在“var x或var y”上使用“delete”关键字,比如“delete x或delete y”这本质上会使它成为垃圾收集吗?@zero,no.
delete window.x
会。
delete x
在严格模式下是不可操作或错误的,我认为。所以从技术上讲,如果我在“var x或var y”中的任何一个上使用“delete”关键字,比如“delete x或delete y”这会让它成为垃圾回收吗?@zero,不会。
delete window.x
会。
delete x
在严格模式下是不可操作或错误的。