Jquery 在$中创建的回调。每个fn和带有for循环的回调的行为是否不同?

Jquery 在$中创建的回调。每个fn和带有for循环的回调的行为是否不同?,jquery,for-loop,each,Jquery,For Loop,Each,全部 我做了一些测试代码,看起来像这样 var selects = [$('#elem1'), $('#elem2'), $('#elem3')]; $.each(selects, function(item){ selects[item].bind('click', function(){ console.log("each function : " + item); }); }); for(var i = 0; i < selects.length;

全部 我做了一些测试代码,看起来像这样

var selects = [$('#elem1'), $('#elem2'), $('#elem3')];

$.each(selects, function(item){
    selects[item].bind('click', function(){
        console.log("each function : " + item);
    });
});

for(var i = 0; i < selects.length; i++){
    var elem = selects[i];
    elem.bind('click', function(e){
        console.log("for loop : " + i);
    });
}
此外,如果我单击名为“elem2”的按钮,结果是:

console $
each function : 0
for loop : 3
console $
each function : 1
for loop : 3
两个循环示例之间发生了什么?请让我知道


谢谢,祝您愉快。

i
指的是计数器变量本身,而不是它的值。您必须按值传递它:

for(var i = 0; i < selects.length; i++){
    var elem = selects[i];

    (function(i) {
        elem.bind('click', function(e) {
            console.log("for loop : " + i);
        });
    })(i);
}
for(变量i=0;i

在匿名函数中隐藏
i
可以做到这一点。

添加
$.fn。每个
为每次迭代创建一个新的执行上下文,以获得完整的答案。您可以在google中搜索
javascript闭包
,了解原因和方法。搜索SO。复制品[太]多了。找到合适的副本后,请适当标记此问题,等等,汉克斯,我没听说什么是结束。我查一下。我很高兴理解这一点!谢谢你,唐月,pst和搅拌机