Javascript取消绑定匿名回调函数

Javascript取消绑定匿名回调函数,javascript,events,callback,anonymous-function,Javascript,Events,Callback,Anonymous Function,是否有可能解除匿名回调函数的绑定 link.addEventListener("click", function () { //Any piece of code }, true); link.removeEventListener("click", function () { //Any piece of code }); 谢谢, Ajain函数由指针标识。您没有指向匿名函数的指针,因此您没有任何要传递给remove()的内容来告诉它要删除哪个函数 简单地传递一个复制函

是否有可能解除匿名回调函数的绑定

link.addEventListener("click", function () {
     //Any piece of code
}, true);

link.removeEventListener("click", function () {
     //Any piece of code
});
谢谢,
Ajain

函数由指针标识。您没有指向匿名函数的指针,因此您没有任何要传递给remove()的内容来告诉它要删除哪个函数

简单地传递一个复制函数并不能做到这一点,因为复制函数有一个不同的指针


您需要坚持将函数分配给一个变量,然后将该变量传递给remove()。

否。因为那些匿名函数实际上是不同的。这与
{a:1}==={a:1}
返回false的原因相同

您需要执行以下操作:

var func = function () { ... };

element.addEventListener( 'click', func, false );

element.removeEventListener( 'click', func, false );

是。您可以通过使用
参数将句柄保存到匿名事件处理程序函数的某个位置来完成此操作。被调用方
,然后使用此保存的引用解除绑定

// binding
var el = document.getElementById('foo');
el.addEventListener('click', function(e) {
    alert('Hi'); 

    // this is where we save a handle to the anonymous handler
    // arguments.callee gives us a reference to this function
    el['_ev'] = arguments.callee;

}, false);


// unbinding
var el = document.getElementById('foo'), handler = el['_ev'];
if(handler) {

    // here we use the saved reference to unbind it        
    el.removeEventListener('click', handler);

    el['_ev'] = false;
}

演示:

这可能与此相关:我不清楚为什么会问这个问题。这似乎意味着您知道可以删除命名事件侦听器,这将是一个简单的更改。是因为您绝对不能更改这段代码,而且您正在寻找一种解决方法,不管它有多难看?您可以通过原型化将
addEventListener
劫持到存储侦听器命名引用的代理函数。可怕的?对我上面所说的。
s/pointer/reference/
因为es5在严格模式下禁止参数。callee-说这种解决方案对当今的开发(2018年)有风险是对的吗?@SergeyRudenko-是的,你是对的。对于新开发,根本不推荐使用此解决方案。