关于js的一个小问题,哪位牛人帮我看看,我是新手

gong1511104848 2013-04-25 08:48:22
$(document).ready(function(){
for(var i = 0;i<3;i++){
$(".haha0").mouseover(function(){
alert(i);
})
}
})

i为什么一直是3呢
...全文
210 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
gong1511104848 2013-04-28
  • 打赏
  • 举报
回复
引用 6 楼 veryhunger 的回复:
<!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>
谢谢你的回答。对我很有用
gong1511104848 2013-04-28
  • 打赏
  • 举报
回复
引用 5 楼 waiting593 的回复:
我尝试解释一下吧,你的代码如下:
$(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>
使用闭包,至于闭包的具体信息,请自己查阅,才能记忆和理解得更牢。
谢谢你的回答。对我很有用
ianafollow 2013-04-27
  • 打赏
  • 举报
回复
for循环作用域问题
  • 打赏
  • 举报
回复
<!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>
UEAnswer 2013-04-26
  • 打赏
  • 举报
回复
我尝试解释一下吧,你的代码如下:
$(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>
使用闭包,至于闭包的具体信息,请自己查阅,才能记忆和理解得更牢。
carlisliu 2013-04-26
  • 打赏
  • 举报
回复
这是js中的闭包,你可以看一下《javascript语言精粹》上的解释,原因是你的mouseover事件函数中引用了ready事件中的变量i,但调用mouseover事件的时候,i已经循环完了,所以i就是3
猿敲月下码 2013-04-26
  • 打赏
  • 举报
回复
gong1511104848 2013-04-26
  • 打赏
  • 举报
回复
引用 1 楼 libian339 的回复:
引用 楼主 gong1511104848 的回复:$(document).ready(function(){ for(var i = 0;i<3;i++){ $(".haha0").mouseover(function(){ alert(i); …… 因为你for循环时,i是先加1,变成3,然后去判断i<3,虽然$(".haha0").mouseover(fun……
好像是这么回事
KK3K2005 2013-04-25
  • 打赏
  • 举报
回复
你理解中是什么呢?
笨笨熊三号 2013-04-25
  • 打赏
  • 举报
回复
引用 楼主 gong1511104848 的回复:
$(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了

87,991

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧