[Javascript] 请问这两段代码有什么不一样吗?

2014 年 10 月 12 日
 click

本人正在学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成功。

4523 次点击
所在节点    JavaScript
22 条回复
willwen
2014 年 10 月 12 日
經典的閉包問題⋯Google "JavaScript 閉包 事件綁定",有你要的答案
simonhtq
2014 年 10 月 12 日
1L正解
ChJJin
2014 年 10 月 12 日
循环后,i为2,楼上说对了,闭包问题
bombless
2014 年 10 月 12 日
经典问题…在闭包中你绑定的是变量而不是值。
你需要在闭包外面再包一个闭包,然后把不变的量通过参数传过去。
像这样:
(function(j){ return function(){ onMou(j); }; })(i)
newghost
2014 年 10 月 12 日
1的结果其实是这样的:

mDD[0].addEventListener('mouseover',function(){onMou(1)});

mDD[1].addEventListener('mouseover',function(){onMou(1)});
newghost
2014 年 10 月 12 日
@newghost

onMou(2)
onMou(2)
zhujinliang
2014 年 10 月 12 日
对数组遍历建议使用forEach
Automan
2014 年 10 月 12 日
@zhujinliang js里明显应该用for i
sneezry
2014 年 10 月 12 日
第一段代码里,i的作用域弄混了,for循环结束后i的值是个定值,无论哪个dom触发mouseover事件,后面函数里的i都是定值。
Doubear
2014 年 10 月 12 日
@bombless 闭包 这个名称是怎么来的?
aa65535
2014 年 10 月 12 日
chone
2014 年 10 月 12 日
for不产生作用域,所以绑定的两个函数中的i在中一个作用域中,因此最终的值是一样的。
zyue
2014 年 10 月 12 日
先unbound 下 再bound
jianghu52
2014 年 10 月 12 日
所以一般来说,代码1里面通常会这么写
var j = i
mDD[j].addEventListener('mouseover',function(){onMou(j)});
click
2014 年 10 月 12 日
v2ex帖子怎么实现代码着色的,我刚发的时候没有颜色的啊。
Mutoo
2014 年 10 月 12 日
@jianghu52 这样写一样的,`j`和`i`在同一层闭包里。
Jaylee
2014 年 10 月 12 日
```
for (var i=0;i<mDD.length;i++){
(function(i){
mDD[i].addEventListener('mouseover',function(){onMou(i)});
})(i)

}

```
ChanneW
2014 年 10 月 12 日
经典
Mutoo
2014 年 10 月 12 日
@click /t/127980 新建topic后,点击编辑,右下角多了个选项,文本标记语法,改为Markdown即可.
bombless
2014 年 10 月 13 日
@Doubear closure,用来表达一种两个集合的包含关系

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/138426

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX