kha*_*vah 1 javascript memory-management backbone.js
考虑以下:
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();
},
});
Run Code Online (Sandbox Code Playgroud)
如果我打电话render0()然后render1,对象会发生什么view0?我是否必须明确销毁旧视图?
view0只要DOM元素#right-block存在,你的意志就会留在记忆中.因为DOM元素上的事件处理程序指向视图的方法,所以它不会被垃圾回收.
理想情况下,您应该调用view0.remove(),这将删除元素DOM和调用stopListening().
但是在您的示例代码中,如果您这样做,该元素#right-block将从DOM中删除,并且view1.setElement("#right-block");将无法按预期工作.
在这种情况下尝试调用 view0.undelegateEvents(); view0.stopListening();,如果没有其他任何东西引用视图实例,它将被垃圾收集