将循环中的计数器赋值给一个变量并不会保留它的当前值
Assigning the counter in a loop to a variable doesn't retain it's current value
我不理解下面的行为。
我希望下面的脚本做以下事情:
- 获取所有button类的元素
- 对于每个带有button的元素,分配一个onclick事件
- 当用户点击按钮时,当onclick被分配时,有一个带有
i
当前值的警报。
所以我希望点击"Button 1"会提示"I am Button 1"。
相反,所有3个按钮提示"我是按钮3"。看起来i
计数器的值没有被保留。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Test</title>
</head>
<body>
<p class="button">Button 0</p>
<p class="button">Button 1</p>
<p class="button">Button 2</p>
<script>
var buttons = document.getElementsByClassName('button');
for (var i=0 ; i < buttons.length ; i++){
buttons[i].onclick = function(){
alert("I am button " + i);
};
}
</script>
</body>
</html>
为什么会发生这种情况?我怎样才能达到我想要的行为?
试试这个。它被称为闭包。它捕获变量i
,因为i
在循环后没有被删除,所以它调用具有i
当前值的事件处理程序。所以你需要一个局部变量,你可以通过执行函数得到它。因此,我创建了一个函数,将变量i
传递给他,并且在函数作用域中,我有一个局部变量param
,每次迭代都是新的。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Test</title>
</head>
<body>
<p class="button">Button 0</p>
<p class="button">Button 1</p>
<p class="button">Button 2</p>
<script>
var buttons = document.getElementsByClassName('button');
for (var i=0 ; i < buttons.length ; i++){
buttons[i].onclick = (function(param){
return function(){
alert("I am button " + param);
};
})(i);
}
</script>
</body>
</html>
或者您可以使用ES6 feature let
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Test</title>
</head>
<body>
<p class="button">Button 0</p>
<p class="button">Button 1</p>
<p class="button">Button 2</p>
<script>
var buttons = document.getElementsByClassName('button');
for (let i = 0 ; i < buttons.length ; i++){
buttons[i].onclick = function(){
alert("I am button " + i);
}
}
</script>
</body>
</html>
回调button.onclick
是一个闭包,它在堆栈中有对i变量的引用,该变量等于循环的最后一个值
相关文章:
- 保留“;这个“;在一个变量中;这个“;使用此变量
- 保留 JQuery Vars 用于另一个函数(全局变量?)
- GAS:在处理程序函数中使用变量时,如何更改全局变量值并保留其更改后的值
- JS坐标->PHP脚本-如何在PHP中保留变量
- 从数组中删除元素,然后保留其状态以备将来使用,而不使用全局变量
- 像cookie这样的全局变量,它在回发后保留值,但应该为不同的实例保存不同的值(选项卡/窗口)
- 如何在 javascript 中保留变量的值
- Javascript 变量函数不保留值
- 文件中.js变量不会保留 AJAX 的值
- 变量和数组将在浏览器内存中保留多长时间
- 更新代码时保留变量
- 为什么 javascript 会保留在外部函数中发生的局部变量重新分配,而不必捕获返回值
- 是否可以在JS中获取保留字(变量,函数,对象名称)的列表
- 如何在 chrome 扩展程序中重新加载浏览器后保留变量的值
- “parent”不应该用作javascript变量名(保留字)
- 如何从控制器保留 html 中的变量
- Javascript继承:父's数组变量保留值
- 可以'不要让一个变量保留它的内容——该死
- nodejs/javascript变量保留其旧值
- 声明一个 JavaScript 变量,它将为 php 变量保留位置