zoukankan      html  css  js  c++  java
  • 闭包

    <body>
        <h3>JS中的闭包陷阱</h3>
        <button>1</button>
        <button>2</button>
        <button>3</button>
        <script>
           var list = document.querySelectorAll('button');
           for(var i=0;i<list.length;i++){
               var b = list[i];
               b.onclick = function(){
                   console.log(i);
               }
           };
        </script>
     </body>

    打印结果都是3

    原因:变量i就1个,并且这段代码不仅是对外公开了一个变量i,还公开了三个不同的监听函数,分别绑定给不同的按钮。

    修改成:

    方法一

    <script>
        var list = document.querySelectorAll('button');
        for (var i = 0; i < list.length; i++) {
            var b = list[i];
            (function (i) {
                b.onclick = function () {
                    alert(i);
                }
            })(i)
        };
    </script>
    

      

     //方法二:匿名函数变成有名函数
    for(var i=0;i<list.length;i++){
         var b = list[i];
         b.onclick = (function(num){//外部函数--此处传递形参num,注意不能再取i为变量名,否则又会重复
            return function(){//内部函数
            console.log(num);
                }
         })(i);//闭包上下文变量i,实参
    }
    

      

      

  • 相关阅读:
    51NOD 1371填数字
    51NOD1052 最大M字段和
    ZROI2018提高day4t3
    ZROI2018提高day4t2
    ZROI2018提高day4t1
    ZROI2018普转提day2t4
    ZROI2018普转提day2t2
    ZROI2018普转提day2t1
    ZROI2018普转提day2t3
    ZROI2018提高day3t3
  • 原文地址:https://www.cnblogs.com/dare/p/7929387.html
Copyright © 2011-2022 走看看