日期:2014-05-16  浏览次数:20315 次

关于js的一个小问题,哪位牛人帮我看看,我是新手
$(document).ready(function(){
for(var i = 0;i<3;i++){
$(".haha0").mouseover(function(){
alert(i);
})
}
})

i为什么一直是3呢

              
JavaScript 函数

------解决方案--------------------
引用:
$(document).ready(function(){
for(var i = 0;i<3;i++){
$(".haha0").mouseover(function(){
alert(i);
……

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



------解决方案--------------------
你理解中是什么呢?
------解决方案--------------------
这是js中的闭包,你可以看一下《javascript语言精粹》上的解释,原因是你的mouseover事件函数中引用了ready事件中的变量i,但调用mouseover事件的时候,i已经循环完了,所以i就是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>

使用闭包,至于闭包的具体信息,请自己查阅,才能记忆和理解得更牢。
------解决方案--------------------
<!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>

------解决方案--------------------
for循环作用域问题