闭包解决for循环 的代码示例,解释为什么for循环后,打印的i值不是它自己当时的取值

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<style>
    li{
        cursor:pointer;
    }
</style>

<ul id="ul1">
    <li>sdfsd</li>
    <li>ffff</li>
    <li>222</li>
    <li>aaa</li>
</ul>
</body>
<script>
    var liList = document.getElementsByTagName("li");

//    有问题的写法
     /*for(var i=0;i<lis.length;i++){
       lis[i].onclick = function(){
            alert(i);
        }
    }
    i=40;*/

//此时,点击li,弹出框显示的信息是40.为什么呢?这说明i值已经被赋值成为40了。而由于点击onclick调用了匿名函数,调用会产生上下文,于是为这个匿名函数创建的上下文,其中它的自由变量i的值取到的是父级作用域的i值,此时i=40。又由于每调用一次onclick就会创建一个上下文,每次建立的上下文中的自由变量i的取值都取的父级作用域中的i值。所以!!点击onclick后,每次都会显示40.而不是0,1,2....。

    //解决问题的写法1:使用闭包的第一种写法
/*    for(var i=0;i<lis.length;i++){
        lis[i].onclick = (function(i){
            return function(){
                alert(i);
            }
        })(i);
    }*/


    //解决问题的写法2:使用闭包的第二种写法
 /*   for(var i=0;i<lis.length;i++){
        (function(i){
                    lis[i].onclick = function(){
                        alert(i+'a');
                    }
                }
        )(i);
    }*/


// 解决问题的写法3,给它的属性赋值:
    for(var i=0;i<liList.length;i++){
        liList[i].index = i;
        liList[i].onclick = function(){
            alert(this.index);
        }
    }

</script>
</html>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值