本帖最后由 shijuren 于 2011-08-02 02:57:19 编辑

解决方案 »

  1.   

    简单的说,你在单击以前,for已经循环完了,i已经递增为3,而单击的事件处理程序中并没有定义i这个变量,所以会引用外部的i,所以一直都为3。要获取当前的i值需要传入i的值。  window.onload = function(){
      var ul = document.getElementById("abc");
      var li = document.getElementsByTagName("li");
      for(var i=0;i<li.length;i++){
      test(li[i],i);
      }
      
      function test(obj,i){
      obj.onclick=function(){
      alert("你单击的是第"+i+"个LI!");
      }
      }
      
      }
      

  2.   


    第一个:论坛上的例子 
    第二个:闭包的理解
    http://topic.csdn.net/u/20110111/18/56C5F609-7989-4E97-9E26-9E54FAD756E6.html#r_71177210
    http://blog.csdn.net/hitman9099/article/details/3854171
      

  3.   

    以下程序会alert什么?
    var arr = [];
    for(var i=0; i< 2;i++){
    var fn = function(){
    alert(i)
    }
    arr.push(fn);
    } for(var j in arr){
    var fn = arr[j];
    fn();
    }
    答案是 2 , 2其实理应让其alert 0,1才对这是因为第一个for循环里面创建函数fn的时候里面的i始终是在同一个作用域
    这样当循环2次后,又执行了一次i++,这时i等于2了. 因为是同一作用域,因此函数里面的i都是2
    要解决此问题,只需要创建一个闭包来实现就可以了,修改第一个for循环:
    var arr = []; for(var i=0; i< 2;i++){
    (function(j){
    var fn = function(){
    alert(j)
    }
    arr.push(fn);
    }(i)); // 创建一个匿名函数并立即执行,传入参数i
    } for(var j in arr){
    var fn = arr[j];
    fn();
    }
    这样就打印 0 1 了.因为闭包里面的参数j跟i不是在同一作用域
      

  4.   


    运行上述程序的时候,firebug显示obj没有被定义