[问题] .hover 与循环?

楼主: skipeco (skipeco)   2014-04-22 12:35:41
最近用jQuery1.10,希望设计成鼠标滑过相应的主选单,子选单就会展开
五个主选单id: MENU1 ~ MENU5
五个子选单id: SUB1 ~ SUB5
原本写成:
$("#MENU1").hover(
function(){
$("#SUB1").slideDown(800);
},function(){
$("#SUB1").slideUp(300);
});
.
.
.
.
$("#MENU5").hover(
function(){
$("#SUB5").slideDown(800);
},function(){
$("#SUB5").slideUp(300);
});
为了希望精简而改成循环,却发现下面这个方法不行
for(var i = 1; i < 6; i++){
$("#MENU"+i).hover(
function(){
alert(i);
$("#SUB"+i).slideDown(800);
},function(){
$("#SUB"+i).slideUp(300);
});
}
我后来以查到可行的写法(内部两个function "#SUB"+变量 要改用 this.id.substr(4)
控制),但仍想请教:
1. 为何明明同样包在循环之内,内部两个function用 i 却无法正确执行?
其原理为何?
2. 在内部function 增设一alert(i)观察,却发现其 i 值是"6"!
甚至超过循环的上限,这又是为何?
有劳各位先进了,谢谢 m(_ _)m
作者: mmis1000 (秋月恋枫)   2014-04-22 12:53:00
因为closure的关系他们的i都是同一个,修改时当然全部都变了http://jsfiddle.net/ZpzbS/ 所以要这样做这是少数js中,不是传值而是传参照的状况,满有名的陷阱至于为何是6,这要从for循环的构造看基本上for循环就是 while循环的语法糖,可以这样展开http://jsfiddle.net/fcPQ7/可以看出,退出循环时,i的值是6
作者: harry1123 (海贼王)   2014-04-22 19:42:00
感谢mm大大!! 刚还在想为啥是6,忘了基本for循环特性OTZ
楼主: skipeco (skipeco)   2014-04-22 23:01:00
感谢m大! 后来找到一篇资料,也刚好几乎是在讲这问题http://goo.gl/27YmRc确实是因为内层神奇地一直能存取外层最新数据造成的m大的传址 和 jsfiddle上的解法真的很精准!
作者: mmis1000 (秋月恋枫)   2014-04-22 23:26:00
另外function的参数,其实相当于自动var一个变量,再存入外部数据

Links booklink

Contact Us: admin [ a t ] ucptt.com