是否可以在不使用箭头表示法的情况下将参数传递到事件侦听器回调函数中?[复制]

Can you pass arguments into an event listener callback function without using arrow notation? [duplicate]

提问人:xerop 提问时间:10/7/2023 最后编辑:xerop 更新时间:10/8/2023 访问量:48

问:

这个问题在这里已经有答案了:
上个月关闭。

此帖子在上个月经过编辑并提交审核,但未能重新打开该帖子:

原始关闭原因未解决

我一直在寻找解决方案,但我找不到合适的资源。
我正在尝试为要在控制台上打印的按钮创建一个事件侦听器。之后我还需要删除此事件。

我将回调函数作为事件侦听器参数之外的函数声明,据我了解,需要引用相同的函数才能将其从事件中删除。请参阅尝试 3。

通过创建回调函数声明,我需要传入参数。如果我在事件侦听器中传入参数,则该事件会在页面加载时立即调用。请参阅尝试 2。

如果我根本没有传入参数或根本没有传入参数,我可以从事件中删除该函数,但由于没有参数,该函数将无法按预期工作。()

这似乎是一个简单的概念,我一直在研究解决方案,但无法理解我在这里缺少什么。

// callback function
function printText(str){
    console.log(str)
}

// attempt 1: no arguments + can remove function after
item.addEventListener('click', printText); 
item.removeEventListener('click', printText);

// attempt 2: // prints but invokes immediately, even when event hasn't happen
item.addEventListener('click', printText('text')); 

// attempt 3:  works but cannot remove after due to being unable to reference the same function
item.addEventListener('click', () => printText('text')); 

编辑:我的目标是看看是否有办法在这种情况下解决这个问题。我已经提到了这个问题的重复项,但它们都没有解决我的问题,也没有在我的尝试中得到解决。我需要将参数传递给我的函数。我不能使用匿名函数 + 该函数必须能够在 的参数之外引用,以便我以后可以删除该函数。addeventlistener()

我已经评论说这不是我试图找到解决方案的确切代码,但它正在模仿我想要实现的目标。我不是在寻找一个循序渐进的解决方案,而主要是试图弄清楚我想要实现的目标是否可行。有没有办法将参数传递到可以在以后引用以从事件侦听器中删除的回调函数中?

JavaScript 回调 参数 addEventListener

评论

1赞 InSync 10/7/2023
printText.bind(null, 'text')或。一定有一个很好的骗子,我似乎还找不到。function printText(arg) { return function() { console.log(arg) } }
1赞 Bergi 10/7/2023
@InSync 不,OP 并没有询问如何将参数传递给 printText,他们知道如何使用箭头函数来实现这一点。他们询问如何删除事件处理程序等匿名函数。使用或闭包并不能解决这个问题。bindfunction
0赞 Bergi 10/7/2023
"通过创建回调函数声明,我需要传入参数。-为什么?难道你就不能直接声明一下,为什么你认为回调需要声明一个参数呢?function printText() { console.log('text'); }
0赞 xerop 10/7/2023
@Bergi 我实际上并不是在尝试解决这个确切的代码,而是一个模仿我想要实现的目标的简化示例。所以不,它并不总是 ,但参数将是变量,将在事件侦听器触发和回调函数之前计算。'text'
1赞 Bergi 10/8/2023
使用闭包(就像你已经做过的那样):为每个按钮声明一个单独的变量和函数,例如,通过将其置于按钮/文本的循环中,或者将其包装在一个将按钮和文本作为参数的函数中。strprintText

答: 暂无答案