本文探讨了在JavaScript循环中为多个DOM元素注册事件时,因变量共享导致所有元素触发最后一次循环值的问题。通过引入立即执行函数(IIFE)构建闭包,确保每个事件处理函数都能正确捕获当前循环变量的值,从而解决该常见陷阱。
JavaScript 循环中 DOM 事件绑定的闭包解决方案
今日在处理代码时遇到一个典型问题:
具体代码实现如下:
// 伪代码示例
for (var i=0; i<n; i++) {
addEvent(obj[i], "click", func(i));
} 上述写法导致所有DOM元素绑定的事件最终都指向循环结束时的 i=n 状态。查阅相关资料发现,这是因为在循环过程中,this 指针及变量引用被不断覆盖,导致已注册的事件也随之改变。经过排查,找到了一种有效的解决方法;
修正后的代码如下:
for (var i=0; i<n; i++) {
(function (i){addEvent(obj[i], "click", function (){func(i);});})(i);
} 此方法利用闭包机制,保持了对循环变量 i 的持久引用,效果显著。
(如果您有更优的解决方案,欢迎交流指正 (*^__^*) 嘻嘻……)