js 的奇怪问题

2018-10-04 19:20:26 +08:00
 lraining
for(var i=0; i<6; i++){
var button = $("#"+ categories[i]);
button.attr("index", i);
button.click(function(){
alert(button.attr("index"));
});
}
如上代码所示,循环一个数组找出对应 id 的 button(自定义的 div),给每个 button 加入自定义属性 index,然后绑定事件,结果点击所有的 button 都是最后一个 button,点击 button 弹出的 alert 显示都是 5,为什么会出现这样的情况?
1694 次点击
所在节点    问与答
7 条回复
IamJ
2018-10-04 19:25:25 +08:00
闭包
des
2018-10-04 19:28:10 +08:00
for(let i=0; i<6; i++){
caomu
2018-10-04 19:29:47 +08:00
button.click 绑定应该放 for 外面吧。。。
jianzhihao1996
2018-10-04 19:30:27 +08:00
作用域问题
rabbbit
2018-10-04 19:39:53 +08:00
button.click(function(){
alert(button.attr("index"));
});
---->
button.click(
(function(button) {
return function() {
alert(button.attr("index"));
}
})(button)
);
heimeil
2018-10-04 19:40:13 +08:00
你 click 里引用的 button 是上层的,每次循环都改变了,当你产生 click 事件的时候循环早就结束了,自然是引用到了循环最后一次产生的 button。

jQuery 方式:
alert($(this).attr("index"));

JS 原生方式:
button.click(function() {
alert(this.attr("index"));
}.bind(button));
lraining
2018-10-04 19:51:26 +08:00
感谢 6 楼,是的,应该是用$(this)代替 button,很明显的问题,还是得细心一些

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

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

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

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

© 2021 V2EX