Avatar ·

如何在JavaScript中让循环中的闭包记住当前迭代的变量值?

大家好!我是JavaScript新手,遇到了一个完全无法理解的问题。我写了一个简单的代码:想给多个按钮添加点击处理程序,让每个按钮输出自己的编号。\n\n这是我的代码:\n\n```javascript\nconst buttons = document.querySelectorAll('button');\nfor (var i = 0; i < buttons.length; i++) {\n buttons[i].addEventListener('click', function() {\n console.log('按钮编号 ' + i);\n });\n}\n```\n\n但当我点击任意按钮时,控制台总是输出“按钮编号 5”(即i的最终值),无论点击哪个按钮都是如此。我读到过这与闭包有关,但不知道如何修复。为什么会这样?如何让每个按钮记住自己的编号?请用简单的语言和例子解释一下。提前谢谢!\n<<>>\n

为什么会出现这个问题?

\n

问题与闭包的工作方式以及通过var声明的变量的作用域有关。关键字var声明的变量是函数作用域,而不是块作用域。在循环中,每次迭代共享同一个i变量。当点击事件触发时,循环已经结束,i的值已经是最终值(例如5)。所有闭包都引用了同一个i,因此输出相同的结果。