为什么来自我的循环的警报总是返回最后一个值,而不是每个迭代值?
我有一些按钮,存储在一个数组中。 然后我循环遍历该数组,为每个按钮添加一个click事件。 每次单击都会提醒i
的值。 我希望值为3
等等,但在案例3
它们总是作为一个值返回。
你能解释为什么会发生这种情况以及如何解决它吗?
请看这个jsFiddle 。 代码如下:
var theButtons = ['.button.one', '.button.two', '.button.three']; for (i=0; i<theButtons.length; i++) { $(theButtons[i]).click(function () { alert(i); // always returns 3 }); }
请尽可能简单明了地解释它 – 我在Javascript和编程方面有点初学者。
当你点击按钮i === 3
。 需要将i
的值传递给闭包:
for (var i = 0; i
小提琴演示: http : //jsfiddle.net/maniator/fE55Y/3/
只需使用EACH方法:
$( ".button" ).each(function( index ) { $(this).click( function(e){ alert( index + ": " + $(this).text()); }); });
小提琴: http : //jsfiddle.net/fE55Y/4/
更新:
同意.each()
不需要被问到什么。 这是不使用.each()
方法的.each()
。
$(".button").click(function () { alert("Button Index: " + $(this).index()); });
欢迎使用异步编程和全局变量!
你在这里看到的问题是因为i
在这种情况下被声明为全局,因为任何地方都可以从任何地方访问。
那么,执行脚本时会发生什么:
- 循环遍历类名数组
- 在每次迭代中,将单击绑定到匹配节点,调用您提供的匿名函数
这里的问题是你提供的函数是在你的循环之外执行的(例如,当点击发生时),所以i
的值是最后一次迭代中的值,在这种情况下2