Javascript 当回调绑定到另一个对象时removeEventListener不工作

Javascript 当回调绑定到另一个对象时removeEventListener不工作,javascript,events,dom-events,Javascript,Events,Dom Events,我最近注意到,当回调传递给绑定到另一个对象的addEventListener函数时,稍后调用removeEventListener将不起作用 例如: /*“this”指的是一个类*/ element.addEventListener('click',this.clickHandler.bind(this)) /*不会删除事件侦听器*/ element.removeEventListener('click',this.clickHandler) 我找到了一个使用默认函数handleEvent的解

我最近注意到,当回调传递给绑定到另一个对象的
addEventListener
函数时,稍后调用
removeEventListener
将不起作用

例如:

/*“this”指的是一个类*/
element.addEventListener('click',this.clickHandler.bind(this))
/*不会删除事件侦听器*/
element.removeEventListener('click',this.clickHandler)
我找到了一个使用默认函数
handleEvent
的解决方法,当您将对象传递给
addEventListener
时,会调用该函数

/*“this”指的是一个类*/
元素。addEventListener('click',this)
/*不会删除事件侦听器*/
元素。removeEventListener('click',this)
this.handleEvent=函数(e){
开关(e型){
'单击':{
这是clickHandler(e);
}
}
}
我写过


但是,我很好奇为什么会发生这种情况?为什么
removeEventListener
没有找到事件处理程序来删除它?

好的,我缺少的是
bind
总是返回一个新函数。这意味着我向
removeEventListener
传递了一个不同的函数,因此无法找到它来删除它。

据我所知,第二个参数必须引用与添加事件时使用的函数完全相同的函数(这意味着,不仅是相同的代码,而且必须引用相同的函数对象。)啊哈!所以
someFunction!==someFunction.bind(someObject)
??这是为什么呢?Ofc,因为bind总是返回一个新函数!太好了,我不知道