jquery中的简单混淆

时间:2013-05-29 04:33:16

标签: jquery loops

 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,为什么?

3 个答案:

答案 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并使用