0

我在将函数从数组绑定到某些元素时遇到问题,但是在单击任何具有“类”类的元素后出现此错误。

未捕获的类型错误:对象函数 (){alert(1)}、函数 (){alert(2)}、函数 (){alert(3)}、函数 (){alert(4)} 的属性“4”不是一个函数

var c = [
    function(){alert(1)},
    function(){alert(2)},
    function(){alert(3)},
    function(){alert(4)}
];

function test(b){
    for(var i = 0; i < b.length; i++){
        $('.class').eq(i).bind('click', function(){
            b[i]();
        });
    }
}

test(c);

我认为变量 i 保持其最后一个值。

任何解决方案或解释将不胜感激。提前致谢。

4

3 回答 3

2

您需要一个闭包 - 在 js 中变量范围由函数确定。使用 jQuery,只需使用.each

$('.class').each(function(i) {
     $(this).on('click', function(){
         alert(i+1);
     });
});

但是,如果您确实需要一组不同的函数,您可以直接将函数本身绑定为处理程序:

var elems = $('.class');
for (var i=0;i<b.length;i++) {
    elems.eq(i).on('click', b[i]);
}
于 2013-02-26T20:12:53.953 回答
1

问题是,在您的循环中,您设置为click处理程序的函数都共享相同的i值。在循环之后,该i值将是4,因此每个函数都会尝试调用b[4],但它不存在。

您需要为每个函数创建一个新范围,以便i值都不同。

for(var i = 0; i < b.length; i++){
    (function(i){
        $('.class').eq(i).bind('click', function(){
            b[i]();
        });
    }(i));
}

您也可以click直接将数组中的函数设置为处理程序。

for(var i = 0; i < b.length; i++){
    $('.class').eq(i).bind('click', b[i]);
}
于 2013-02-26T20:20:30.403 回答
1

您的函数数组只有 4 个项目,因此b[4]未定义。与其b在您的点击处理程序中引用,不如将其设为点击处理程序本身:

elems.eq(i).on('click', b[i]);

通过这样做,i将在循环中的每次迭代中检查 的值,而不是在单击元素时(此时其值应始终为4)。

于 2013-02-26T20:12:27.447 回答