解决方案 »

  1.   

    js没有块级作用域,if、for、switch之类都是没有独立作用域的,
    for( var i=0; i<pAry.length; i++ ) { 
    ...
    等价于:
    var i;
    for( i=0; i<pAry.length; i++ ) { 
    ...解决方法是用有独立作用域的函数来保护变量,也就是你说的闭包了,这算是闭包的作用之一:
    for( i=0; i<pAry.length; i++ ) { 
    (function(i){
     pAry[i].onclick = function() {      
             alert(i); 
     }
    })(i);
    }
      

  2.   


    function init() {      
        var pAry = document.getElementsByTagName("p");      
        for( i=0; i<pAry.length; i++ ) { 
             pAry[i].onclick = (function(input){
                return function() {      
                     alert(input); 
                }
             })(i);
        }  
    }  
      

  3.   


    pAry[i].onclick = function() { alert(i); 这一行的作用并不是规定点击第几个p就弹出几,而是规定:不论点击哪个p,都弹出函数 init 中的变量 i 。当你点击任意一个p弹出变量 i 的时候,这个时候 i 早已经变成了5即pAry.length的值(实际上,for循环完毕后  i 就已经变成5了),所以会弹出5。