谁能给个详解。。原理到实例 
<body>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>
  <script type="text/javascript">
var li=document.getElementsByTagName("li");
for(var i=0;i<li.length;i++){
li[i].onclick=function(  ){
alert(i );
}
}
  </script>
 </body>

解决方案 »

  1.   

    每个li点击后 本意是要得到0,1,2,3的
    可都alert出4。
      

  2.   

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>无标题文档</title>
    </head><body>
    <ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    </ul>
      <script type="text/javascript">
    var li=document.getElementsByTagName("li");
    for(var i=0;i<li.length;i++){
    !function(i){
    li[i].onclick=function(){
    alert(i);
    }
    }(i)
    }
      </script></body>
    </html>
    楼主是想拿到当前的i值吗?
      

  3.   


    在绑定事件外层加个立即执行的匿名函数就行了~·
    li[i].onclick=function(){
    alert(i);
    }
    就能正确拿到i值了
      

  4.   

    for(var i=0;i<li.length;i++){
    li[i].onclick=function( ){
    alert(i );
    }
    }像你这么写的话,如果外层不加一个立即执行的函数,它拿到的i值永远是for循环不成立条件的值,也就是4如果外层套一个匿名函数,把当前的i值传入进去,那li[i].onclick=function( ){这个闭包的上层就是那个匿名函数,而那个匿名函数又正好存着当前的i值,所以就能拿到了
      

  5.   

    如果外层不加一个立即执行的函数,它拿到的i值永远是for循环不成立条件的值,也就是4为何。。再分解下。。
      

  6.   


    因为Javascript是用函数function划分作用域的~·
    如果你外层不加一个函数,那这个闭包的上传就是for循环的那个作用域,如果你加上一个函数,那这个闭包的上层就是这个匿名函数的作用域了
      

  7.   

    有点明白那段代码的意思了,闭包的目的就是为了需要的东西不被js的垃圾回收机制回收,LZ那样写的话i的值就被回收了,于是每次都输出4,后面的解决方法就是保留了i的值,使之没有被回收,这样子理解对么?
      

  8.   

    因为i的值是4 所以输出是4你肯定说 我第一个click函数 在绑定的时候 i=0 为什么会输出4
    这个就是闭包的功劳了
    因为 那个 i在你执行click的时候 已经是 4了记住 你的click函数 调用的是 i 不是 i的值
    所以 i在变化的话 click的每次调用 只能是 i最后的值
      

  9.   

    换个角度去思考
    看示例:    var i = 0;
        i = 1;
        i = 2;
        function test() {
            alert(i);
        };
        test();直到你运行test()这句时,才知道i的值是2,不运行的时候是不知道的,对吧。来看你的例子,你只是给li赋了一个属性,这个属性的值是一个函数的指针。
    但是仅仅是个赋值而已。
    仅当你在点击li时,才会计算,而当你点击时,这个全局变量i的值已经变化了不知道这样是不是容易理解一些。
      

  10.   

    你自己的代码,先为4个element的onclic事件指定function,然后onclick某个element时才会执行相应的function,而这些function下的i都是全局下的i,这个i在for结束后就成了。如果你动作够快,在还没来得急绑定完所有事件处理函数时,就点击前面绑定好了的element,这里弹出的一定不是4,不过这个人是不太可能做到的。你的代码里没有形成闭包,对于那些说“闭包的功劳,调用的i不是i的值”都是瞎扯蛋。大道再至简还是得自己走。
      

  11.   

    for(var i=0;i<li.length;i++){
    li[i].onclick=function( ){
    alert(i );
    }
    }for  是立即执行的,你点击的时候才会触发alert(i),问题是你点的时候,循环已经结束了,i 已经是 4 了。
      

  12.   

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

  13.   


    18楼说的不错,在你触发click的时候,循环已经完了, i已经是4了,所以,不管你单击的是什么,他alert的出来的是4,但是上面的办法是当在绑定click的时候,就执行一个匿名函数,把i当做匿名函数的参数即刻调用,而不等循环结束才调用。而这个匿名函数的返回值也一个函数...
      

  14.   

    http://topic.csdn.net/u/20110731/12/3531376d-c359-45de-832a-48209b02f6c1.html