本人正在学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 日 via iPhone 經典的閉包問題⋯Google "JavaScript 閉包 事件綁定",有你要的答案
|
2
simonhtq 2014 年 10 月 12 日
1L正解
|
3
ChJJin 2014 年 10 月 12 日
循环后,i为2,楼上说对了,闭包问题
|
4
bombless 2014 年 10 月 12 日
经典问题…在闭包中你绑定的是变量而不是值。
你需要在闭包外面再包一个闭包,然后把不变的量通过参数传过去。 像这样: (function(j){ return function(){ onMou(j); }; })(i) |
5
newghost 2014 年 10 月 12 日
1的结果其实是这样的:
mDD[0].addEventListener('mouseover',function(){onMou(1)}); mDD[1].addEventListener('mouseover',function(){onMou(1)}); |
7
zhujinliang 2014 年 10 月 12 日 via Android
对数组遍历建议使用forEach
|
8
Automan 2014 年 10 月 12 日
@zhujinliang js里明显应该用for i
|
9
sneezry 2014 年 10 月 12 日
第一段代码里,i的作用域弄混了,for循环结束后i的值是个定值,无论哪个dom触发mouseover事件,后面函数里的i都是定值。
|
11
aa65535 2014 年 10 月 12 日
|
12
chone 2014 年 10 月 12 日 via iPhone for不产生作用域,所以绑定的两个函数中的i在中一个作用域中,因此最终的值是一样的。
|
13
zyue 2014 年 10 月 12 日
先unbound 下 再bound
|
14
jianghu52 2014 年 10 月 12 日
所以一般来说,代码1里面通常会这么写
var j = i mDD[j].addEventListener('mouseover',function(){onMou(j)}); |
15
click OP v2ex帖子怎么实现代码着色的,我刚发的时候没有颜色的啊。
|
17
Jaylee 2014 年 10 月 12 日
```
for (var i=0;i<mDD.length;i++){ (function(i){ mDD[i].addEventListener('mouseover',function(){onMou(i)}); })(i) } ``` |
18
ChanneW 2014 年 10 月 12 日
经典
|