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