Javascript 如何防止内存泄漏?

Javascript 如何防止内存泄漏?,javascript,backbone.js,memory-leaks,marionette,backbone-events,Javascript,Backbone.js,Memory Leaks,Marionette,Backbone Events,TLDR对于主干事件,当事件对象没有更多侦听器时,是否有方法触发一些代码 我有一个主干木偶视图,可以监听型号a上的更改事件。当我处理完视图后,我调用view.close(),这会导致它停止侦听模型A上的所有事件。如果这个模型没有被其他任何东西引用,它现在可以被垃圾收集 然而,我的问题是Model A正在侦听Model B上的更改事件,而这反过来又在侦听来自web套接字的实时更新 因此,当Model A停止侦听Model B时,它可以被释放,但Model B仍将保留在内存中,因为web套接字具有回

TLDR对于主干事件,当事件对象没有更多侦听器时,是否有方法触发一些代码

我有一个主干木偶视图,可以监听
型号a
上的更改事件。当我处理完视图后,我调用
view.close()
,这会导致它停止侦听
模型A上的所有事件。如果这个模型没有被其他任何东西引用,它现在可以被垃圾收集

然而,我的问题是
Model A
正在侦听
Model B
上的更改事件,而这反过来又在侦听来自web套接字的实时更新

因此,当
Model A
停止侦听
Model B
时,它可以被释放,但
Model B
仍将保留在内存中,因为web套接字具有回调。添加
modelB.close()
方法不一定有效,因为其他对象可能仍在使用
modelB
。但是,如果没有其他对象正在使用
模型B
的实例,那么我希望它触发它的
停止侦听
方法,这将反过来让web套接字知道,当不再有任何内容在侦听它时,它可以关闭

编辑: 基于答案的解决方案; 示例使用

var BackboneExt = require('/path/to/gist');

var modelB = Backbone.Model.extend({
    initialize: function() {
        BackboneExt.autoCleanup(this);
    }
});

所有EventAggregator都是以这样的方式实现的,即某人拥有一个回调函数列表,这些回调函数将在某些“事件”中执行。如果一个对象公开了EventAggregator API,这意味着它有效地提供了一个列表,任何人都可以在其中写入它的名称和电子邮件,以及您希望何时和如何联系的原因。通常情况下,你不只是拿到名单和一支笔,而是需要填写一份登记表,然后由第三方处理,如果你通过了所有验证标准,第三方将把你列入该名单。如果您想从该列表中取消订阅,也一样


现在,谁有这个名单?任何提供自己的EventAgRigatorAPI的人都有这样一个列表。因此,如果您的modelB为其他模块提供了EventAggregator API,这意味着它拥有包含所有订阅者的列表。如果该列表为空(modelB可以检查该列表),它可以去告诉其他人,例如您的websocket模块。

所有EventAggregator的实现方式都是,有人拥有在某些“事件”中执行的回调函数列表。如果一个对象公开了EventAggregator API,这意味着它有效地提供了一个列表,任何人都可以在其中写入它的名称和电子邮件,以及您希望何时和如何联系的原因。通常情况下,你不只是拿到名单和一支笔,而是需要填写一份登记表,然后由第三方处理,如果你通过了所有验证标准,第三方将把你列入该名单。如果您想从该列表中取消订阅,也一样


现在,谁有这个名单?任何提供自己的EventAgRigatorAPI的人都有这样一个列表。因此,如果您的modelB为其他模块提供了EventAggregator API,这意味着它拥有包含所有订阅者的列表。如果该列表为空,modelB可以检查哪个,它可以去告诉其他人,例如您的websocket模块。

主干网的模型扩展了Events类,因此
model B
已经有一个它可以检查的回调列表。问题是知道什么时候去核对清单;由于
Backbone.Events
中的
off
函数不会触发
callbackRemoved
事件。您必须使用触发器扩展
Backbone.Events
off
方法,该触发器在(1)执行
off
方法时触发,并且(2)列表随后包含0个条目。为了注册该回调函数,您需要将其作为属性附加到
Backbone.Events
modelB
都可以访问的对象。我有点希望有人已经扩展了Backbone,但我已经创建了一个解决方案,请参见;主干网的模型扩展了Events类,因此
模型B
已经有了一个可以检查的回调列表。问题是知道什么时候去核对清单;由于
Backbone.Events
中的
off
函数不会触发
callbackRemoved
事件。您必须使用触发器扩展
Backbone.Events
off
方法,该触发器在(1)执行
off
方法时触发,并且(2)列表随后包含0个条目。为了注册该回调函数,您需要将其作为属性附加到
Backbone.Events
modelB
都可以访问的对象。我有点希望有人已经扩展了Backbone,但我已经创建了一个解决方案,请参见;