$(document).ready(function(){
for(var i = 0;i<3;i++){
$(".haha0").mouseover(function(){
alert(i);
})
}
})i为什么一直是3呢JavaScript函数

解决方案 »

  1.   

    因为你for循环时,i是先加1,变成3,然后去判断i<3,虽然$(".haha0").mouseover(function(){..不会执行了,但alert(i)里的i已经是3了
      

  2.   

    这是js中的闭包,你可以看一下《javascript语言精粹》上的解释,原因是你的mouseover事件函数中引用了ready事件中的变量i,但调用mouseover事件的时候,i已经循环完了,所以i就是3
      

  3.   

    我尝试解释一下吧,你的代码如下:
    $(document).ready(function(){//jquery版的window.onload
    for(var i = 0;i<3;i++){//循环,其中i 函数定义在匿名函数中,在整个匿名函数中可见且唯一
    $(".haha0").mouseover(function(){//嵌套函数
    alert(i);//i为var i,注意在外面for循环过程中i是变化的。
    })
    }
    })
    所以你的i都是3,因为for循环执行完i就是3,退出匿名函数时也是3.正确做法使用闭包:
    $(document).ready( function() {  
        var i;
        for(i = 0;i<3;i++) {
            (function(x) {            
                var id="#div"+(x+1);
                $(id).click(function(){
                    alert(x);
                 });
            }(i));
        }
    });
    <div id="div1">div1</div>
    <div id="div2">div2</div>
    <div id="div3">div3</div>
    使用闭包,至于闭包的具体信息,请自己查阅,才能记忆和理解得更牢。
      

  4.   

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Untitled Document</title>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    </head><body>
    <div id="divId1">fsf</div>
    <div id="divId2">fsffffffff</div>
    <div id="divId3">fsffffffffffff</div>
    <script type="text/javascript">
    for(var i=0; i<3; i++) {
    document.getElementById('divId' + (i + 1)).onclick = function(j) {
    return function() {
    alert(j);
    };
    }(i);
    }
    </script>
    </body>
    </html>
      

  5.   

    for循环作用域问题