$('<a/>').click(function(event) { ChangeXYZ(event); });
上面的问题是我不想要事件,但我还有其他的变种。
$('<a/>').click(function() { ChangeXYZ(var123); });
但是行的问题是,它在运行时获得var123的值,因为我在循环中添加它,所以总是最后使用var123的最后一个值。看起来它正在使用var123的参考。如何在创建它时使用var123的值而不是单击时间。
答案 0 :(得分:4)
使用闭包
function (val) {
return function() {
ChangeXYZ(val);
}
}(var123);
注意:未经测试,但应该有效。
编辑:修正拼写
答案 1 :(得分:2)
让我们说你的for循环看起来像这样:
for (var var123=0; var123<10; var123++) {
$('<a/>').click(function() { ChangeXYZ(var123); });
}
将其更改为:
for (var var123=0; var123<10; var123++) {
(function() {
$('<a/>').click(function() { ChangeXYZ(var123); });
})();
}
使用闭包来包装for循环可以解决问题。实际上,如果你通过JSLint运行你的程序,你会得到一个警告:“在循环中创建函数时要小心。考虑将函数放在一个闭包中。”
答案 2 :(得分:1)
是否有理由在修改var123之前无法发出声明staticvar123 = var123;
并将代码更改为:
$('<a/>').click(function() { ChangeXYZ(staticvar123); });
答案 3 :(得分:0)
首先,请记住,如果您将循环中的click事件附加到同一个元素(在您的情况下是元素$('<a/>')
),那么您最终会响应N次该元素的同一事件。所以你可能不想要这个,你需要将调用移到.click
之外。
其次,如果你仍然需要这样的东西,我相信@ sanand0有一个错误你应该考虑将一个参数传递给调用函数并在函数中使用这个参数:
for (var var123=0; var123<10; var123++) {
(function(v) {
$('<a/>').click(function() { ChangeXYZ(v); });
}(var123));
}