为什么来自我的循环的警报总是返回最后一个值,而不是每个迭代值?

我有一些按钮,存储在一个数组中。 然后我循环遍历该数组,为每个按钮添加一个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