我有3个.a
和一个函数,用于警告[0,1或2] .a
所属的数字mouseover
- 编辑:
function a(){
for(var c=0; c<3; c++){
alert(c);
$('.a:eq('+c+')').mouseover(function(){alert(c)});
}
}
当我执行它时,第一个alert(c)
被触发三次,消息分别为“0”,“1”,“2”,如预期的那样。
但是,当mouseover
.a
,无论是哪个.a
时,都会提醒“3”。
如果有人能解释为什么会发生这种情况并提供解决方案,我将不胜感激。
答案 0 :(得分:5)
因为c = 3。
每次运行时,您的循环会向C
添加1,代码运行后C
仍等于3,为您的警报提供C
的值,即3。
您的示例可以完全重写并简化为
$('.a').mouseover(function(){
alert($(this).index());
});
这将为类a
的所有元素生成警报,并在$('.a')
生成的数组中给出它们的位置。
BTW:将函数放入循环时出现JSLint错误,如果你想让JSLint保持高兴,请查看this Question
答案 1 :(得分:1)
您在javascript中被函数范围变量捕获。这是一个很大的javascript问题。
你需要创建一个函数来执行你想要的for循环体做的事情并将c作为参数。
答案 2 :(得分:1)
C绑定到内存中的相同物理位置,因此当您使用鼠标悬停运行警报时,它将从最后一个设置值3中拉出。
如果你想对这个主题进行更深入的阅读,你实际上是在变量c上创建一个'闭包'。
试试这个
function a(){
for(var c=0; c<3; c++){
alert(c);
(function(a){
$('.a:eq('+a+')').mouseover(function(){alert(a)});
})(c);
}
}
答案 3 :(得分:1)
这种情况正在发生,因为您的每个mouseover
函数都使用相同的c
值,循环完成时为3
。
你需要关闭&#34;捕获&#34;每次迭代的c
值。
function a(){
for(var c=0; c<3; c++){
alert(c);
var func = function(c){
return function(){ // closes around the current value of "c"
alert(c);
};
};
$('.a:eq('+c+')').mouseover(func(c));
}
}