读书人

关于js的一个小疑点,哪位牛人帮小弟我

发布时间: 2013-06-25 23:45:42 作者: rapoo

关于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循环作用域问题

读书人网 >JavaScript

热点推荐