Javascript Backbone.js事件和内存管理

Javascript Backbone.js事件和内存管理,javascript,backbone.js,Javascript,Backbone.js,我想使用Backbone.js处理一些事件,但我对循环引用和内存管理没有信心。假设我有一个名为EventStation的静态事件源-因此,在脚本的开头我说: var source = new EventSource(); source是为了页面的生命而活,这很好。现在,我还有一个事件消费者: var EventConsumer = Backbone.Model.extend({ initialize: function(params) { source.on("some

我想使用Backbone.js处理一些事件,但我对循环引用和内存管理没有信心。假设我有一个名为EventStation的静态事件源-因此,在脚本的开头我说:

var source = new EventSource();
source
是为了页面的生命而活,这很好。现在,我还有一个事件消费者:

var EventConsumer = Backbone.Model.extend({
    initialize: function(params) {
        source.on("some_event",this.onSomeEvent,this);
    }
});

function later() {
    var consumer = new EventConsumer();

    // consumer now gets leaked... (I think)
}
我会在某个时候调用
later()
,最后,我再也无法访问consumer,除非我在
source
的内部进行挖掘。我想我需要向
EventConsumer
添加一些新函数,比如

cleanup: function() {
    source.off("some_event",this.onSomeEvent,this);
}
然后在
later()的末尾调用它

这似乎。。。没有我想要的那么干净。有没有更好的办法?如果我使用DOM事件,这个处理方式会有所不同吗?

请阅读以下内容:

虽然它专门讨论视图,但它适用于任何事件绑定对象

还包括:

Johnny Oshika使用“bindTo”方法和“unbindAll”方法管理事件绑定和解除绑定的想法非常出色。我强烈建议在为您管理事件的对象中使用这些方法

如果您希望实现此功能,我将其内置到我的主干中。木偶框架,此处:

这段代码是麻省理工学院授权的开源代码,所以你可以自由地复制它并在任何地方使用它。。。不需要仅为了获得此功能而使用木偶

要使用BindTo对象,请将其扩展到您自己的对象:


var source = _.extend({}, Backbone.Marionette.BindTo);
或者将其用作原型:


var source = Object.create(Backbone.Marionette.BindTo);
然后绑定作为第一个参数传递事件源的事件,然后绑定所有标准主干事件参数:


source.bindTo(myObj, "some_event", this.doStuff, this);
解开一切束缚


source.unbindAll();
我的实施文档可在以下位置找到:


这很公平——我想这就行了。