gpt4 book ai didi

javascript - 将绑定(bind)函数绑定(bind)和取消绑定(bind)到事件

转载 作者:行者123 更新时间:2023-11-30 18:06:58 28 4
gpt4 key购买 nike

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

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

问题是我需要在稍后的某个时间解除绑定(bind),所以我写道:

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

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

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

这非常有效,但如果您有几个事件处理程序,代码很快就会开始变得不那么可读了。

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

最佳答案

Underscore.js 为这个用例提供了一个 bindAll 方法,来自 documentation :

Binds a number of methods on the object, specified by methodNames, to be run in the context of that object whenever they are invoked

否则,您可以使用闭包,它在调用时始终返回相同的绑定(bind)函数,即:

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];
}

关于javascript - 将绑定(bind)函数绑定(bind)和取消绑定(bind)到事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15587551/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com