Javascript 如何控制变量提升?
我在将函数从数组绑定到某些元素时遇到了一个问题,但在我单击类为“class”的任何元素后,就会出现这个错误 未捕获的TypeError:对象函数()的属性“4”{alert(1)},函数(){alert(2)},函数(){alert(3)},函数(){alert(4)}不是函数Javascript 如何控制变量提升?,javascript,jquery,Javascript,Jquery,我在将函数从数组绑定到某些元素时遇到了一个问题,但在我单击类为“class”的任何元素后,就会出现这个错误 未捕获的TypeError:对象函数()的属性“4”{alert(1)},函数(){alert(2)},函数(){alert(3)},函数(){alert(4)}不是函数 var c=[ 函数(){alert(1)}, 函数(){alert(2)}, 函数(){alert(3)}, 函数(){alert(4)} ]; 功能测试(b){ 对于(变量i=0;i
var c=[
函数(){alert(1)},
函数(){alert(2)},
函数(){alert(3)},
函数(){alert(4)}
];
功能测试(b){
对于(变量i=0;i
我认为变量我保留了它的最后一个值
任何解决方案或解释都将不胜感激。
提前感谢。您的函数数组只有4项,因此
b[4]
未定义。不要在单击处理程序中引用b
,而是将其设置为单击处理程序本身:
elems.eq(i).on('click', b[i]);
通过这样做,
i
的值将在循环中的每次迭代中检查,而不是在单击元素时(此时其值应始终为4
)。您的函数数组只有4个项,因此b[4]
是未定义的。不要在单击处理程序中引用b
,而是将其设置为单击处理程序本身:
elems.eq(i).on('click', b[i]);
通过这样做,
i
的值将在循环中的每次迭代中检查,而不是在单击元素时(此时其值应始终为4
)。您需要一个闭包-js中的变量范围由函数确定。使用jQuery,只需使用。每个:
$('.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]);
}
var elems=$('.class');
对于(var i=0;i您需要一个闭包-在js中,变量范围由函数决定。对于jQuery,只需使用。每个:
$('.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]);
}
var elems=$('.class');
对于(var i=0;i问题是,在循环中,设置为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
处理程序的函数都共享相同的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));
}
这不是提升。这是范围。试试这个:$('.class').eq(i).bind('click',b[i]);
你的数组只有4个索引(0,1,2,3)由于您的错误是第5个索引未定义,这意味着您的循环一定走得太远了,尽管我不马上明白原因。但在这一点之外,您的索引存在范围问题。单击事件b[i]()将始终调用数组中的最后一个函数。@KevinB:循环完成后,i
将是4
。所有函数都将在同一个i
附近“关闭”,因此它们都会说b[4]
不存在。@RocketHazmat啊,所以在循环结束时,i再次增加一次到4,在这一点上,它没有通过测试并退出,但仍然是4,导致它在单击事件中失败。解决范围问题可以解决这个问题。这不是提升。这是范围。试试这个:$('.class')。eq(i)。bind('click',b[i]);
您的数组只有4个索引(0,1,2,3),因为您的错误是第5个索引未定义,这意味着您的循环一定走得太远了,尽管我不马上明白原因。但是在这之外,您的索引存在范围问题。单击事件b[i]()将始终调用数组中的最后一个函数。@KevinB:循环完成后,i
将是4
。所有函数都将在同一个i
附近“关闭”,因此它们都会说b[4]
不存在。@RocketHazmat啊,因此在循环结束时,i再次增加一次到4,在这一点上它没有通过测试并退出,但它仍然是4,导致它在单击事件中失败。解决范围问题可以解决这个问题。但是,b[4]是如何解决的呢
被叫?@RocketHazmat我知道为什么I
被设置为4
。我仍然认为我的答案指向了op为什么会看到这个错误。@RocketHazmat我添加了一个关于如何解决这个问题的建议。b[4]
被呼叫?@RocketHazmat我意识到为什么I
设置为4
。我仍然认为我的答案指向了op看到错误的原因。@RocketHazmat我添加了一个关于如何解决问题的建议。非常感谢您的帮助。非常感谢您的帮助。