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+')')   

        }    

    }    

  • 相关阅读:
    debug error 错误日志的调试模式
    fork(2)
    Fundamental theorem of arithmetic 为什么1不是质数
    Compile-time Dependency Injection With Go Cloud's Wire 编译时依赖注入 运行时依赖注入
    LevelDB
    MySQL Bugs: #34354: Feature request: EXPLAIN ALTER TABLE https://bugs.mysql.com/bug.php?id=34354
    explain 分析 聚合统计语句的性能
    (原创)《Android编程权威指南》学习笔记01-- Android应用初体验--005
    (原创)《Android编程权威指南》学习笔记01-- Android应用初体验--004
    (原创)《Android编程权威指南》学习笔记01-- Android应用初体验--003
  • 原文地址:https://www.cnblogs.com/jayruan/p/5962665.html
Copyright © 2011-2022 走看看