Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何控制变量提升?_Javascript_Jquery - Fatal编程技术网

Javascript 如何控制变量提升?

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

我在将函数从数组绑定到某些元素时遇到了一个问题,但在我单击类为“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
我认为变量我保留了它的最后一个值

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

您的函数数组只有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我添加了一个关于如何解决问题的建议。非常感谢您的帮助。非常感谢您的帮助。