为了账号安全,请及时绑定邮箱和手机立即绑定

用for循环注册事件,事件里边的变量问题

用for循环注册事件,事件里边的变量问题

何以励成 2016-06-23 23:37:37
比如有这样的代码for(var i = 0; i < list.length; i++){ list[i].onclick = function(){                alert(i); } }用for循环注册事件,不管点击哪个list选项,alert都是list.length,怎么样做才能alert的当前的i值?
查看完整描述

5 回答

已采纳
?
刚毅87

TA贡献345条经验 获得超309个赞

因为点击事件是在 for 循环走完之后才执行的,所以会出现上述情况.

此时就需要记录i 值

for(var i = 0; i < list.length; i++){
list[i].index = i;
list[i].onclick = function(){
                alert(this.index);
}
}

现在就是点击哪个,打印哪个.

望采纳!

查看完整回答
3 反对 回复 2016-06-24
?
Suber丶林

TA贡献75条经验 获得超180个赞

原因是JavaScript没有局部作用域,所以for循环结束后,i的值就是list.length,而当触发click事件时候,理所当然弹出list.length。这时候要么用1楼的存变量方法,也可以使用闭包(http://www.imooc.com/wenda/detail/318961 ← 戳这里,问题一样 ),如下:

// 使用len存储list.length,优化性能,提防每次循环都获取list.length
for (var i = 0, len = list.length; i < len; i++) {
    list[i].onclick = (function (index) {
        return function() {
            alert(index);
        };
    }(i));
}


查看完整回答
4 反对 回复 2016-06-24
?
Walk_

TA贡献48条经验 获得超30个赞

点击事件是异步触发的,触发事件时,for循环早已经执行完了,所以点击事件向上查找i值时,得到的i值都是相同的。

加层闭包就好了。

(function(i){

    for(){........};

})(i)

查看完整回答
3 反对 回复 2016-06-24
?
咕咕问

TA贡献78条经验 获得超12个赞

js闭包    for(var i=0; i<10; i++){(function(i){console.log(i);})(i)}   (function(参数A){})(参数A)

查看完整回答
1 反对 回复 2016-06-24
?
我是陈东东

TA贡献11条经验 获得超1个赞

for(var i = 0; i < list.length; i++){

    this.onclick = function(){

                alert(i);

    }

}


查看完整回答
反对 回复 2016-06-28
  • 5 回答
  • 0 关注
  • 1840 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信