如何获取闭包中循环的i值

假设有这样的一个问题:ul中含有多个li标签,我们想对每个li绑定点击事件,并且打印出该li为第几个li元素

一般写法是写一个for循环

var lis = document.getElementsByTagName("li");
 for (var i = 0; i < lis.length; i++) {
    lis[i].onclick = function(){

        console.log(arg);
    };      
 }

但是,这样写之后我们发现,点击任何一个li,打印的值都为5,这是因为闭包中共用i值,而i的值由于执行for循环,都变为了5

为了正常显示i值,我们可以使用如下方法

//方法1:加一层闭包 将i值以参数形式传递给内层函数
 for (var i = 0; i < lis.length; i++) {
    (function(arg){
        lis[i].onclick = function(){
            console.log(arg);
        };
    })(i)   
 }

/*方法二:加一层闭包,i以局部变量形式传递给内层函数*/
for (var i = 0; i < lis.length; i++) {
    (function(){
        var temp = i;
        lis[i].onclick = function(){
            alert(temp);
        }
    })()    
 }

/*方法三:将i值作为对象的属性值*/
for (var i = 0; i < lis.length; i++) {
    lis[i].i = i;
    lis[i].onclick = function(){
        console.log(this.i);
    }
 }

/*方法4:用function实现 实际上,没产生一个函数实例就会产生一个闭包*/
 for (var i = 0; i < lis.length; i++) {
    lis[i].onclick = new Function("console.log("+i+");")
 }

参考文献:在循环中正确找到对应DOM元素的索引

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值