问题:关闭
您的代码有一个由$t
. 发生的情况是每个按钮上都安装了一个点击处理程序;所有这些点击处理程序都将按钮称为$t
. 这意味着在安装处理程序时获取对的引用,并在调用处理程序时$t
对其进行评估。
应该很容易看出这是怎么回事:当调用任何处理程序时,循环已经完成,$t
最后一个按钮的值也已迭代。实际上,每个按钮都有一个处理程序,其操作就像最后一个按钮被单击一样。
如何解决
一种方法是首先避免创建闭包:
$(function() {
$("button").each(function() {
$(this).on("click", function() {
console.log("Id: " + $(this).attr('id'));
});
});
});
不$t
,没问题。你实际上可以把它写成
$(function() {
$("button").on("click", function() {
console.log("Id: " + $(this).attr('id'));
});
});
否则,您需要确保每次循环迭代$t
都不同$t
。做到这一点的方法是将范围限制$t
在循环体中。由于 JavaScript 具有函数作用域,因此唯一的方法是在现场引入和调用函数:
$(function() {
$("button").each(function() {
var $t=$(this);
(function($u) {
$u.on("click", function() {
console.log("Id: " + $u.attr('id'));
});
})($t);
});
});
在这个版本中,每个处理程序实际上都依赖于$u
,而处理程序之间又不共享它。这解决了闭包问题。
请注意,我也可以命名最内层的函数参数$t
(在这种情况下,该名称将隐藏$t
在迭代范围内);我选择不这样做只是为了清楚。