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-是的,你是对的。对于新开发,根本不推荐使用此解决方案。