{ var i=0; btns[i].addEventListener('click', function () { console.log('第' + i + '个按钮被点击') }) } { var i=1; btns[i].addEventListener('click', function () { console.log('第' + i + '个按钮被点击') }) } { var i=2; btns[i].addEventListener('click', function () { console.log('第' + i + '个按钮被点击') }) } 这一段代码中,为什么不管点击哪个button,控制台都是打印5
时间: 2024-02-24 18:56:31 浏览: 135
VB窗体的多控件的处理_控件_多控件_verticalu1i_VB_
这是因为在 JavaScript 中,变量的作用域是函数作用域,而不是块级作用域。在代码中,使用 `var` 声明的变量 `i` 在整个函数体内都是可见的,而不仅仅是在 `for` 循环内可见。
因此,当点击任何一个按钮时,使用的都是同一个变量 `i`,而这个变量的值在循环结束后被赋值为 `5`。因此,无论点击哪个按钮,控制台都会输出 `第5个按钮被点击`。
要解决这个问题,可以使用闭包来保留每个循环中的变量值。例如,可以将事件处理程序函数放在一个立即执行的函数表达式中,这样每个函数就会有自己的作用域,不会相互干扰。下面是一个示例代码:
```javascript
for (var i = 0; i < btns.length; i++) {
(function (j) {
btns[j].addEventListener('click', function () {
console.log('第' + j + '个按钮被点击');
});
})(i);
}
```
在上面的代码中,使用立即执行的函数表达式来创建闭包,将变量 `i` 的值传递给闭包中的参数 `j`。这样,每个事件处理程序函数都会有自己的作用域,并且不会相互干扰。
阅读全文