JavaScript模式和垃圾收集
一段时间以来,我一直在使用两个版本的JavaScript模式,这是我从Addy Osmani那里学到的,称为模块模式 此模式的第一个版本使用对象文字: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
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
在严格模式下是不可操作或错误的。