zoukankan      html  css  js  c++  java
  • 闭包

    function init() {    

        var pAry = document.getElementsByTagName("p");    

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

             pAry[i].onclick = function() {    

             alert(i);    

        }    

      }    

    }    

    解决方式有两种,

    1、将变量 i 保存给在每个段落对象(p)上

    function init() {    

      var pAry = document.getElementsByTagName("p");    

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

         pAry[i].i = i;    

         pAry[i].onclick = function() {    

            alert(this.i);    

         }    

      }    

    }    

    2、将变量 i 保存在匿名函数自身

    function init2() {    

      var pAry = document.getElementsByTagName("p");    

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

       (pAry[i].onclick = function() {    

            alert(arguments.callee.i);    

        }).i = i;    

      }    

    }    

    再增加3种

     3、加一层闭包,i以函数参数形式传递给内层函数

    function init3() {    

      var pAry = document.getElementsByTagName("p");    

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

       (function(arg){        

           pAry[i].onclick = function() {        

              alert(arg);    

           };    

       })(i);//调用时参数    

      }    

    }    

    4、加一层闭包,i以局部变量形式传递给内存函数

    function init4() {    

      var pAry = document.getElementsByTagName("p");    

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

        (function () {    

          var temp = i;//调用时局部变量    

          pAry[i].onclick = function() {      

            alert(temp);      

          }    

        })();    

      }    

    }    

    5、加一层闭包,返回一个函数作为响应事件(注意与3的细微区别)

    function init5() {    

      var pAry = document.getElementsByTagName("p");    

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

       pAry[i].onclick = function(arg) {    

           return function() {//返回一个函数    

           alert(arg);    

         }    

       }(i);    

      }    

    }   

    又有一种方法

    6、用Function实现,实际上每产生一个函数实例就会产生一个闭包

    function init6() {    

        var pAry = document.getElementsByTagName("p");    

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

          pAry[i].onclick = new Function("alert(" + i + ");");//new一次就产生一个函数实例   

        }    

    }   

    再增加一种

    7、用Function实现,注意与6的区别

    function init7() {    

        var pAry = document.getElementsByTagName("p");    

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

             pAry[i].onclick = Function('alert('+i+')')   

        }    

    }    

  • 相关阅读:
    nacos + seata 报错 endpoint format should like ip:port
    Error creating bean with name 'com.example.demo.ProviderFacade': Requested bean is currently in creation: Is there an unresolvable circular reference?
    leetcode 剑指 Offer 65不用加减乘除做加法
    vscode使用spring boot配置详解
    使用springmvc中视图解析器InternalResourceViewResolver遇到访问出错
    docker tomcat修改时区有效方法
    wsl2 docker mysql重启之后无法连接问题
    docker tomcat部署应用并且连接到docker mysql数据库
    vscode git使用
    vscode wsl2使用maven操作{添加包到meavn,测试操作}
  • 原文地址:https://www.cnblogs.com/jayruan/p/5962665.html
Copyright © 2011-2022 走看看