zoukankan      html  css  js  c++  java
  • 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+')')
        } 
    } 
  • 相关阅读:
    Linux搭建ldap前的准备工作
    samba配置文件帮助以及selinux配置
    rpcbind服务引起的nfs链接报错
    Linux中的inode
    hdu3974 Assign the task线段树 dfs序
    HDU1540线段树维护连续子区间
    2020牛客NOIP赛前集训营-提高组(第一场)C 牛牛的最大兴趣组
    Golang字符串是否存在于切片或数组中的小工具(基本等同于python in语法)
    快速修改MySQL数据库名称
    CPU利用率高,如何排查?
  • 原文地址:https://www.cnblogs.com/yangzhilong/p/2891808.html
Copyright © 2011-2022 走看看