重复添加匿名箭头函数到事件处理器的绑定与触发次数疑问
重复添加匿名箭头函数到事件处理器的绑定与触发次数疑问
嘿,这个问题问得特别实在!我来给你讲明白:
每次你调用 hintCell.addEventListener("click", () => { ... }) 的时候,那个箭头函数都是一个全新的函数实例——哪怕代码写得一模一样,JavaScript每次执行这行代码都会创建一个完全独立的函数对象。
所以如果把这个事件绑定语句调用5次,就等于给hintCell的click事件绑定了5个互不相同的事件处理器。这时候你点击一下这个元素,someCode和moreCode就会被连续执行5次,因为每个绑定的函数都会被触发一次。
这里顺便提个小区别:如果换成命名函数,情况就不一样了。比如:
const handleClick = () => { someCode; moreCode; }; // 第一次绑定 hintCell.addEventListener("click", handleClick); // 第二次绑定同一个函数引用 hintCell.addEventListener("click", handleClick);
这种情况下,第二次调用不会新增监听器——因为JS会识别到这是同一个函数对象,重复绑定相同的监听器会被忽略。但你的匿名箭头函数每次都是新对象,所以不会有这个“自动去重”的效果。
备注:内容来源于stack exchange,提问作者Clay Nichols
相关产品推荐
相关产品推荐

