此代码应该在您单击时弹出带有图像编号的警报:
for(var i=0; i<10; i++) {
$("#img" + i).click(
function () { alert(i); }
);
}
Run Code Online (Sandbox Code Playgroud)
您可以在http://jsfiddle.net/upFaJ/看到它无效.我知道这是因为所有的click-handler闭包都指向同一个对象i,因此每个处理程序在触发时会弹出"10".
但是,当我这样做时,它工作正常:
for(var i=0; i<10; i++) {
(function (i2) {
$("#img" + i2).click(
function () { alert(i2); }
);
})(i);
}
Run Code Online (Sandbox Code Playgroud)
你可以在http://jsfiddle.net/v4sSD/看到它的工作原理.
它为什么有效?i内存中只有一个对象,对吧?对象总是通过引用传递,而不是复制,因此自执行函数调用应该没有区别.两个代码片段的输出应该相同.那么为什么i要复制对象10次呢?它为什么有效?
我认为这个版本不起作用很有意思:
for(var i=0; i<10; i++) {
(function () {
$("#img" + i).click(
function () { alert(i); }
);
})();
}
Run Code Online (Sandbox Code Playgroud)
似乎将对象作为函数参数传递会产生重大影响.
编辑:好的,所以前面的例子可以解释i为通过值传递给函数调用的primitives().但是这个使用真实对象的例子呢?
for(var i=0; i<5; …Run Code Online (Sandbox Code Playgroud) javascript ×1