• 闭包


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

        }    

    }    

  • 相关阅读:
    UVA 11997 K Smallest Sums
    POJ 1007 DNA Sorting
    POJ 3669 Meteor Shower
    POJ 2376 Cleaning Shifts
    POJ 3050 Hopscotch
    操作系统第6次实验报告:使用信号量解决进程互斥访问
    操作系统第5次实验报告:内存管理
    操作系统第4次实验报告:文件系统
    操作系统第3次实验报告:管道
    操作系统第2次实验报告:创建进程
  • 原文地址:https://www.cnblogs.com/jayruan/p/5962665.html
Copyright © 2020-2023  润新知