JavaScript闭包 取for循环i 【转】

转自:http://blog.csdn.net/nx8823520/article/details/6858126

如下的html,为什么每次输出都是5,而不是点击每个p,就alert出对应的1,2,3,4,5。

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

解决方式:

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+')')  
     }   
  }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容