在JavaScript中,删除使用bind()添加为事件侦听器的函数的最佳方法是什么?
例
(function(){
// constructor
MyClass = function() {
this.myButton = document.getElementById("myButtonID");
this.myButton.addEventListener("click", this.clickListener.bind(this));
};
MyClass.prototype.clickListener = function(event) {
console.log(this); // must be MyClass
};
// public method
MyClass.prototype.disableButton = function() {
this.myButton.removeEventListener("click", ___________);
};
})();
我能想到的唯一方法是跟踪添加了bind的每个侦听器。
上面的示例使用此方法:
(function(){
// constructor
MyClass = function() {
this.myButton = document.getElementById("myButtonID");
this.clickListenerBind = this.clickListener.bind(this);
this.myButton.addEventListener("click", this.clickListenerBind);
};
MyClass.prototype.clickListener = function(event) {
console.log(this); // must be MyClass
};
// public method
MyClass.prototype.disableButton = function() {
this.myButton.removeEventListener("click", this.clickListenerBind);
};
})();
有没有更好的方法可以做到这一点?
bindAll
简化绑定方法的功能。在对象初始化程序内部,您只需_.bindAll(this)
将对象中的每个方法设置为绑定版本。另外,如果您只想绑定某些方法(为防止意外的内存泄漏,我建议这样做),则可以将它们作为参数提供:_.bindAll(this, "foo", "bar") // this.baz won't be bound
。
this.clickListener = this.clickListener.bind(this);
this.myButton.addEventListener("click", this.clickListener);