本人正在学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 1
經典的閉包問題⋯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 1
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
经典
|