
本人正在学JS,做一个标签切换效果,有个问题很久没搞不懂。
mDD.length=2 请问这两段代码又什么不一样吗,测试效果不一样。
代码1:
for (var i=0;i<mDD.length;i++){ mDD[i].addEventListener('mouseover',function(){onMou(i)}); } 代码2:
mDD[0].addEventListener('mouseover',function(){onMou(0)}); mDD[1].addEventListener('mouseover',function(){onMou(1)}); 代码1实现不了效果,换成代码2成功。
1 willwen 2014-10-12 11:30:05 +08:00 via iPhone 典的包Google "Javascript 包 事件定",有你要的答案 |
2 simonhtq 2014-10-12 11:31:23 +08:00 1L正解 |
3 ChJJin 2014-10-12 11:32:13 +08:00 循环后,i为2,楼上说对了,闭包问题 |
4 bombless 2014-10-12 12:01:09 +08:00 经典问题…在包中你绑定的是变量而不是值。 你需要在闭包外面再包一个闭包,然后把不变的量通过参数传过去。 像这样: (function(j){ return function(){ onMou(j); }; })(i) |
5 newghost 2014-10-12 12:04:18 +08:00 1的结果其实是这样的: mDD[0].addEventListener('mouseover',function(){onMou(1)}); mDD[1].addEventListener('mouseover',function(){onMou(1)}); |
7 zhujinliang 2014-10-12 12:19:00 +08:00 via Android 对数组遍历建议使用forEach |
8 Automan 2014-10-12 12:24:35 +08:00 @zhujinliang js里明显应该用for i |
9 sneezry 2014-10-12 12:33:48 +08:00 第一段代码里,i的作用域弄混了,for循环结束后i的值是个定值,无论哪个dom触发mouseover事件,后面函数里的i都是定值。 |
11 aa65535 2014-10-12 13:10:48 +08:00 |
12 chone 2014-10-12 13:54:56 +08:00 via iPhone for不产生作用域,所以绑定的两个函数中的i在中一个作用域中,因此最终的值是一样的。 |
13 zyue 2014-10-12 14:14:17 +08:00 先unbound 下 再bound |
14 jianghu52 2014-10-12 14:16:39 +08:00 所以一般来说,代码1里面通常会这么写 var j = i mDD[j].addEventListener('mouseover',function(){onMou(j)}); |
15 click OP v2ex帖子怎么实现代码着色的,我刚发的时候没有颜色的啊。 |
17 Jaylee 2014-10-12 16:16:02 +08:00 ``` for (var i=0;i<mDD.length;i++){ (function(i){ mDD[i].addEventListener('mouseover',function(){onMou(i)}); })(i) } ``` |
18 ChanneW 2014-10-12 17:52:17 +08:00 经典 |
19 Mutoo &nbs; 2014-10-12 22:38:13 +08:00 |