Javascript Backbone.js中的内存管理
考虑以下几点:Javascript Backbone.js中的内存管理,javascript,backbone.js,memory-management,Javascript,Backbone.js,Memory Management,考虑以下几点: SomeView = Backbone.View.extend({ render0: function () { var view0 = new View0(); view0.setElement("#right-block"); view0.render(); }, render1: function(event) { var
SomeView = Backbone.View.extend({
render0: function () {
var view0 = new View0();
view0.setElement("#right-block");
view0.render();
},
render1: function(event) {
var view1 = new View1();
view1.setElement("#right-block");
view1.render();
},
});
如果调用
render0()
,然后调用render1
,对象view0
会发生什么情况?我必须明确地破坏旧的视图吗 不,您不必破坏旧视图。对象中本身超出范围的变量不必手动清除。当它们超出范围或父对象被删除时,其中包含的数据也可以进行垃圾收集。否,您不必销毁旧视图。对象中本身超出范围的变量不必手动清除。当它们超出范围或删除父对象时,其中包含的数据也将符合垃圾收集的条件。只要DOM
元素#right block
存在,您的view0
将保留在内存中。因为DOM元素上的事件处理程序指向视图的方法,所以它不会被垃圾收集
理想情况下,您应该调用view0.remove()
,这将从DOM
中删除元素,并调用stopListening()
但是在示例代码中,如果这样做,元素#right block
将从DOM中删除,而view1.setElement(“right block”)代码>无法按预期工作
在这种情况下,请尝试调用view0.undelegateEvents();view0.stopListening()代码>,如果没有任何其他内容引用视图实例,则它将被垃圾收集只要DOM
元素#right block
存在,您的view0
将保留在内存中。因为DOM元素上的事件处理程序指向视图的方法,所以它不会被垃圾收集
理想情况下,您应该调用view0.remove()
,这将从DOM
中删除元素,并调用stopListening()
但是在示例代码中,如果这样做,元素#right block
将从DOM中删除,而view1.setElement(“right block”)代码>无法按预期工作
在这种情况下,请尝试调用view0.undelegateEvents();view0.stopListening()代码>,如果没有其他内容引用视图实例,它将被垃圾收集我理解。我担心的是,即使它们在render()
之后超出了作用域,它们似乎仍然没有被垃圾收集,因为视图仍然在运行。我理解。我担心的是,即使它们在render()
之后超出了范围,但它们似乎仍然没有被垃圾收集,因为视图仍然在运行。或者,如果要与现有元素一起使用,则覆盖View0#remove
以仅取消legateevents
和停止侦听
,通过这种方式,您可以始终调用remove
。或者覆盖View0#remove
以仅undelegateEvents
和停止侦听
,如果它打算与现有元素一起使用,那么您可以始终调用remove
。