Javascript 从处理程序函数中删除窗口事件侦听器

Javascript 从处理程序函数中删除窗口事件侦听器,javascript,event-listener,Javascript,Event Listener,我有一个函数begin,它声明了一个带有处理函数check的addEventListener。现在,当在检查中满足特定条件时,我想删除eventListener 我的代码: function begin(data){ //code window.addEventListener('keyUp', check(data)); } function check(data){ return function check1(event){ //code

我有一个函数
begin
,它声明了一个带有处理函数
check
的addEventListener。现在,当在
检查中满足特定条件时,我想删除eventListener

我的代码:

function begin(data){
    //code
    window.addEventListener('keyUp', check(data));
}

function check(data){
    return function check1(event){
        //code
        if(condition) window.removeEventListener('keyUp', check(data));
    }
}

一切正常,但它没有删除
EventListener

您必须使
检查(数据)
响应函数对于处理程序是唯一的,就像将其传递给变量一样。否则,每次调用
check(data)
并试图删除错误的函数时,都会得到另一个函数

var handler;

function begin(data) {
    handler = check(data);
    window.addEventListener('keyUp', handler);
}

function check(data) {
    return function check1(event) {
        if(condition) {
            window.removeEventListener('keyUp', handler);
        }
    }
}

check1
对于
check
的每次调用始终是不同的函数,因此您可以使用
窗口删除它本身。removeEventListener('keyup',check1)


正如其他人指出的,您的处理程序函数不是
check
,因此无法删除它。handler函数是check返回的函数

为了更好地理解发生了什么,你可以打字

check().prototype.constructor.name // 'check'
check.prototype.constructor.name   // 'check1'

可能是Psst的副本,它是removeEventListener(),而不是removeListener():)另外:阅读答案。它不应该是removeEventListener吗?当然,谢谢。刚从问题中复制了代码@在这个特定示例中,MetaphoxYou不需要全局变量。您可以使用
check1
而不是
handler
,因为每次调用
check
时,它总是不同的。。我明白了!谢谢,哇。这个也起作用了。现在我很困惑,因为艾斯贝尔的答案也有效。我应该把哪一个标记为最佳答案我投这个票,但另一个家伙的分数比较低,所以你也可以喂另一个:Dyours更好,因为它使用的是已经可用的东西。^拿a+1
check().prototype.constructor.name // 'check'
check.prototype.constructor.name   // 'check1'