理由については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);
}