Javascript RemoveEventListener不';行不通

Javascript RemoveEventListener不';行不通,javascript,ecmascript-6,Javascript,Ecmascript 6,我有一个非常奇怪的例子,它阻止我删除eventListener。这是一个非常简单的函数,可以绑定到键盘事件并在不需要时解除绑定(理论上) 代码如下: const keyboardEvents = function(input, remove = false) { const { key, func } = input; const operation = remove ? 'removeEventListener' : 'addEventListener'; funct

我有一个非常奇怪的例子,它阻止我删除
eventListener
。这是一个非常简单的函数,可以绑定到键盘事件并在不需要时解除绑定(理论上)

代码如下:

const keyboardEvents = function(input, remove = false) {
    const { key, func } = input;
    const operation = remove ? 'removeEventListener' : 'addEventListener';

    function keyboardFunction(event) {
        console.log(event);

        if (event.keyCode === key) {
            func();
        }
    }

    window[operation]('keyup', keyboardFunction);

  if (remove) {
    console.log('REMOVED');
  } else {
    console.log('ADDED');
  }
};
我用它运行

keyboardEvents({ key: 27, func: testFunc }); // add event
keyboardEvents({ key: 27, func: testFunc }, true); // remove event
问题是,侦听器没有被删除。我能做什么

代码笔供参考:

我也尝试了不使用
操作
,只编写代码

if (remove) {
  window.removeEventListener('keyup', keyboardFunction);
} else {
  window.addEventListener('keyup', keyboardFunction);
}

结果是相同的。

您需要为从事件处理程序中删除提供相同的函数引用。每次调用
keyboardEvents
时,都会创建一个名为
键盘功能
,因此有不同于通话的功能。那为什么你不能移除它呢


尝试此代码。

您需要为从事件处理程序中删除提供相同的函数引用。每次调用
keyboardEvents
时,都会创建一个名为
键盘功能
,因此有不同于通话的功能。那为什么你不能移除它呢


试试这段代码。

它在你的小提琴上正常工作不是,控制台中的注释可以,但监听器仍然存在(请参阅Chrome Inspector中的
事件监听器
选项卡)。它在你的小提琴上正常工作不是,控制台中的注释可以,但监听器仍然存在(请参阅Chrome Inspector中的
事件监听器
选项卡)。我明白了。因此我应该将
键盘函数
作为参数传递给
键盘事件
?我尝试在外部定义它,但没有成功(请参阅更新的fiddle).@TomekBuszewski我在想。你需要每次都有相同的引用。但是请注意,为什么你在每个
keyup
上附加新的eventlistener?这是非常短暂的绑定,所以没有必要创建一个更大的侦听器并保留它。我明白了。所以我应该将
键盘函数作为参数传递给
keyboaRdeEvents
?我尝试在外部定义它,但这不起作用(请参阅更新的fiddle)。@TomekBuszewski我在想。你需要每次都有相同的引用。但是请注意,为什么你在每个
键上都附加新的eventlistener?这是非常短暂的绑定,所以创建一个更大的侦听器并保留它是没有意义的。