for(var m=1;m<=26;m++)
{
$("#letter"+m).click(function() {
$("#letter1").attr('value', m);
j = 0;
setValue(this.value, length);
changeImage("#img");
})
}
在上面的代码中,所有内容都完全符合预期,但唯一的问题是:当我单击letter1,letter2等字母时,letter1上的值应分别为1,2,依此类推,如我所料
$("#letter1").attr('value', m);
但是点击任何按钮时值总是27,为什么?
答案 0 :(得分:3)
Igor关于原因是正确的(当处理程序执行时,m
一直是27
),但我建议采用不同的解决方案。
如果我们使用不随循环变化的其他变量,您将获得预期的行为。 JavaScript具有函数范围的最简单方法是使用函数:
function attachHandler(m) {
// Since it's an argument, the m in here will initially take the value of the
// m outside, but it's not the same variable, so it won't change as the
// outside m changes.
$("#letter"+m).click(function() {
$("#letter1").attr('value', m);
j = 0;
setValue(this.value, length);
changeImage("#img");
});
}
for(var m=1;m<=26;m++) {
attachHandler(m);
}
常见的习惯用法是使用立即调用的函数表达式:
for(var m = 1; m <= 26; m++) {
(function(m) {
$("#letter"+m).click(function() {
$("#letter1").attr('value', m);
j = 0;
setValue(this.value, length);
changeImage("#img");
});
})(m);
}
答案 1 :(得分:0)
当click
处理程序执行时,循环已经完成,m
被赋值为27 - 循环终止。
for(var m=1;m<=26;m++)
{
$("#letter"+m).attr("valueOfM", m);
$("#letter"+m).click(function() {
$("#letter1").attr('value', $(this).attr("valueOfM"));
j = 0;
setValue(this.value, length);
changeImage("#img");
});
}
答案 2 :(得分:0)
你的循环每次增加26次运行26次,所以m最终为27.也许你想要的是将不同的var设置为1并使用