相关疑难解决方法(0)

为什么在函数调用中捕获对象的值?

此代码应该在您单击时弹出带有图像编号的警报:

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

5
推荐指数
1
解决办法
679
查看次数

标签 统计

javascript ×1