• JS闭包操作


    <html >    
    
    <head>    
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />    
    <title>闭包演示</title>    
    <script type="text/javascript">    
    function init() {    
      var pAry = document.getElementsByTagName("p");    
      for( var i=0; i<pAry.length; i++ ) {    
        pAry[i].onclick = function() {    
          alert(i);    
        }    
      }    
    }    
    </script>    
    </head>    
    <body onload="init();">    
    <p>产品一</p>    
    <p>产品二</p>    
    <p>产品三</p>    
    <p>产品四</p>    
    <p>产品五</p>    
    </body>    
    </html>

    以上的代码会产生每次都输出5,而不是对应的0,1,2,3,4,如何避免这种问题出现呢?

    解决方案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:加一层闭包,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+')')
        } 
    } 
  • 相关阅读:
    .net web开发经典图书总结
    Asp.net Web API实战
    扩展方法之二分查找
    在线转换图片文件等
    如何减少代码中的分支语句
    web插件化解决方案 开发分享
    .NET 4.5 MEF 基于约定的编程模型重典
    所有排序总结(内排序)
    生成zip文件
    open source ESB and integration platform
  • 原文地址:https://www.cnblogs.com/yangzhilong/p/2891808.html
Copyright © 2020-2023  润新知