このコードは、クリックしたときに画像の番号を含むアラートをポップアップ表示することになっています。
for(var i=0; i<10; i++) {
$("#img" + i).click(
function () { alert(i); }
);
}
http://jsfiddle.net/upFaJ/で動作していないことがわかります。これは、すべてのクリック ハンドラー クロージャーが同じ object を参照しているためであることがわかっているため、すべてのハンドラーがi
トリガーされると「10」がポップアップします。
ただし、これを行うと、正常に動作します。
for(var i=0; i<10; i++) {
(function (i2) {
$("#img" + i2).click(
function () { alert(i2); }
);
})(i);
}
http://jsfiddle.net/v4sSD/で動作していることがわかります。
なぜそれが機能するのですか?i
メモリにはまだ 1 つのオブジェクトしかありませんよね? オブジェクトは常にコピーではなく参照によって渡されるため、自己実行関数呼び出しは違いを生じさせません。2 つのコード スニペットの出力は同一である必要があります。i
では、オブジェクトが 10 回コピーされるのはなぜでしょうか。なぜそれが機能するのですか?
このバージョンが動作しないのは興味深いと思います:
for(var i=0; i<10; i++) {
(function () {
$("#img" + i).click(
function () { alert(i); }
);
})();
}
オブジェクトを関数パラメーターとして渡すと、すべての違いが生じるようです。
i
編集: OK、前の例は、関数呼び出しに値で渡されるプリミティブ ( ) によって説明できます。しかし、実際のオブジェクトを使用するこの例はどうでしょうか?
for(var i=0; i<5; i++) {
var toggler = $("<img/>", { "src": "http://www.famfamfam.com/lab/icons/silk/icons/cross.png" });
toggler.click(function () { toggler.attr("src", "http://www.famfamfam.com/lab/icons/silk/icons/tick.png"); });
$("#container").append(toggler);
}
動作しない: http://jsfiddle.net/Zpwku/
for(var i=0; i<5; i++) {
var toggler = $("<img/>", { "src": "http://www.famfamfam.com/lab/icons/silk/icons/cross.png" });
(function (t) {
t.click(function () { t.attr("src", "http://www.famfamfam.com/lab/icons/silk/icons/tick.png"); });
$("#container").append(t);
})(toggler);
}