我需要销毁 Backbone Collection 吗?

Do I need to destroy a Backbone Collection?

如果我在 Backbone 中创建了一个新的 Collection 实例,我需要注意删除它吗?

这与我删除视图时视图绑定到 models/collections 的解除绑定/stopListeningTo 事件无关。

这种情况是我可能会创建多个 collection 并将它们多次传递给视图。每个视图都被彻底删除,它绑定到 collection 的任何回调都被删除,但 collection 本身没有。

我不确定一旦用 collection 实例化的视图被删除,JavaScript 的垃圾 collection 是否只会删除 collection - 因为它不再被任何东西引用?

例如在下面的。如果 changePage 被多次调用(用户在两个页面之间来回轻弹)每次我创建一个名为 pageCollection 的新 collection。这将传递给 OtherView 的新实例。每次 OtherView 都会被移除,并且它附加到 collection 的任何回调都会被移除。但不是页面Collection本身。

在这种情况下,我可以依靠 JavaScript 删除页面 Collection 因为随着视图的消失,它不再被引用了吗?或者 - 我应该跟踪它并将其删除吗?

app = {};

MyCollection = Backbone.Collection.extend({

    pagination: function() {
        return this.slice(0,19); //e.g. first 20 items
    }

}}

app.myCollection = new MyCollection();
app.myCollection.fetch();


MyView = Backbone.View.extend({

    changePage: function(page) {

        var pagedModels = app.myCollection.pagination();
        //I'll get one of these every time changePage is called
        var pagedCollection = new MyCollection(pagedModels);
        //use pageCollection to render the view e.g.
        var thumbsView = new OtherView({collection: pagedCollection}); 
       //not shown - use a 'region controller' to render this view
       //this will dispose of the last instance of OtherView and 
       //callbacks it attached to the collection
    }

})

唯一保留对集合的引用的是 OtherView 实例。您只需要确保不存在对视图的引用。垃圾收集器会在它认为合适的时候收集它。

DOM 中的视图元素将阻止其被垃圾收集器收集。因此,如您所知,在视图上调用 remove 或手动取消绑定所有内容(来自 jQuery、Backbone 和本机的事件以及任何引用)是必要的。

如果 model.collection 尚未设置,模型在添加到集合时会自动保留对集合的引用。因此,如果它们来自另一个系列,模型将不会获得新系列并且一切都很好,请记住这一点,因为它可能会在某天引起问题。

[...] can I rely on JavaScript to remove pageCollection [...]

我会说 因为无论如何,Backbone 集合没有 delete 功能。使用 JavaScript,您 真的不需要跟踪对象 并明确删除它们。您需要跟踪引用并将其删除。

提前研究一下可能存在的内存泄露问题固然好,但也最好不要掉进过早优化的无限坑中。当您遇到无法找到源头的泄漏,或者只是不知道如何修复时,请返回 SO 并询问。