此代码应该在您单击它时弹出带有图像编号的警报:
for(var i=0; i<10; i++) {
$("#img" + i).click(
function () { alert(i); }
);
}
您可以在http://jsfiddle.net/upFaJ/看到它不起作用。我知道这是因为所有的 click-handler 闭包都引用同一个 object i
,所以每个处理程序在触发时都会弹出“10”。
但是,当我这样做时,它工作正常:
for(var i=0; i<10; i++) {
(function (i2) {
$("#img" + i2).click(
function () { alert(i2); }
);
})(i);
}
你可以在http://jsfiddle.net/v4sSD/看到它的工作。
为什么它有效?i
内存中仍然只有一个对象,对吗?对象总是通过引用传递,而不是复制,所以自执行函数调用应该没有区别。两个代码片段的输出应该是相同的。那么为什么i
对象被复制了 10 次呢?为什么它有效?
我认为这个版本不起作用很有趣:
for(var i=0; i<10; i++) {
(function () {
$("#img" + i).click(
function () { alert(i); }
);
})();
}
似乎将对象作为函数参数传递会产生重大影响。
编辑:好的,所以前面的示例可以i
通过按值传递给函数调用的原语 () 来解释。但是这个使用真实物体的例子呢?
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);
}
工作:http: //jsfiddle.net/YLSn6/