1

我在我的应用程序中使用EventEmitter2作为内部消息总线。现在我需要绑定和取消绑定一些事件处理程序。由于我还希望它们将它们绑定到给定的上下文,因此我最终得到以下语法:

messageBus.on('foo::bar', _.bind(eventHandler, this));

问题是我需要在稍后的时间点解除绑定,所以我写道:

messageBus.off('foo::bar', _.bind(eventHandler, this));

不幸的是,这不起作用,因为_.bind每次都返回包装函数的一个新实例。现在我当然可以运行_.bind一次并绑定包装的函数,例如:

var fn = _.bind(eventHandler, this);
messageBus.on('foo::bar', fn);
messageBus.off('foo::bar', fn);

这工作得很好,但是如果你有一些事件处理程序,代码很快就会变得比必要的可读性差。

在不需要外部化对函数的调用的情况下如何解决这个问题bind?如果您多次调用它并且函数和上下文相同,是否有一个替代函数总是返回相同的包装器?

4

1 回答 1

2

Underscore.jsbindAll为这个用例提供了一个方法,来自文档

绑定由 methodNames 指定的对象上的许多方法,以便在调用它们时在该对象的上下文中运行

如果做不到这一点,你可以使用一个闭包,它在调用时总是返回相同的绑定函数,即:

function getOrCreateBoundEventHandlerFor(eventType, callback) { 

    // Initialise the handler map if it's not already been created.
    this._boundEventHandlerMap = this._boundEventHandlerMap || {};

    // If no handler was mapped, create a new one.
    if (this._boundEventHandlerMap[eventType] === void 0) {
        this._boundEventHandlerMap[eventType] = _.bind(callback, this);
    }

    return this._boundEventHandlerMap[eventType];
}
于 2013-03-23T14:29:28.700 回答