JavaScript:For循环问题

时间:2012-05-21 19:23:58

标签: javascript jquery for-loop

我有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”

http://jsfiddle.net/f6tQn/

如果有人能解释为什么会发生这种情况并提供解决方案,我将不胜感激。

4 个答案:

答案 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));       
    }
}

DEMO:http://jsfiddle.net/vDbu3/

相关问题