事件监听器中的 JavaScript 闭包

标签 javascript closures

<button>test</button>
<button>test</button>
<button>test</button>
<button>test</button>
<button>test</button>
<script>
var nodes = document.getElementsByTagName('button');
function clicked(i){
    console.log('pass');

    // Closure
    // return function(){
    //  console.log(i);
    // }

}
for (var i = 0; i < nodes.length; i++) {
   nodes[i].addEventListener('click', clicked(i));
}
</script>

我试图对js闭包有一个充分的理解,上面的函数甚至为按钮添加了监听器。它控制台记录“通过”5 次,然后单击按钮时不执行任何操作。但如果我取消注释掉关闭位(返回),console.log 将回显 i,但不会记录“pass”。我确实找到了相关答案,但我不明白为什么关闭 onclick 在单击按钮时不会记录“pass”字符串,而是会注销 i

How do JavaScript closures work?

最佳答案

您在这里所做的是直接调用函数clicked,而不是将其设置为事件处理程序。

i don't get why with closure onclick doesn't log the 'pass' string when button clicked instead does log out the i.

好吧,你的关闭是

return function(){
  console.log(i);
}

为什么会记录除 i 之外的任何内容?

创建此闭包的函数应在页面初始化期间记录“pass”五次(当您在循环中调用五次时,每次记录一行并返回闭包)。

您可以使用绑定(bind)

nodes[i].addEventListener('click', clicked.bind(nodes[i], i));

这将为您提供 i 作为函数的参数,以便您可以执行以下操作

console.log("pass", i);

关于事件监听器中的 JavaScript 闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26227286/

相关文章:

javascript - JavaScript Date 中的 T 分隔符是什么

javascript - SVG 动画在 IE & Edge 上出现 "out of bounds"

javascript - 如何延迟 JavaScript 的加载

javascript - jQuery.ajax() 中的范围问题

jquery - Spring Security登录成功后如何回调AJAX成功函数?

rust - 如何在闭包和函数之间传递参数?

swift - 在 swift 中的 try/catch 中何处放置延迟完成闭包

javascript - 返回特定语句的正则表达式

javascript - 在 javascript 中为日期选择器设置 maxDate 和 minDate,不起作用

javascript - 无法在尝试的验证函数中访问 javascript 父函数 - 可能需要关闭