这是最一般的闭包,任何教科书都有,函数在执行的时候循环早就运行完毕退出了,alert(i)此时的i你把它理解为引用、指针之类的东西就行了。

解决方案 »

  1.   

    onload 触发循环,循环执行完毕i=4.点击时alert(i)就是4了
      

  2.   

    因为所有的i都是同一个变量,弹出的4是循环结束后i的值
    只要再用一层闭包,把每次i的值独立出来就可以了
      window.onload = function(){
         for(var i=1; i < 4; i++){
            var id = document.getElementById("a" + i);
    (function(i){
       id.onclick = function(){
                 alert(i);//现在都是返回4
               }
    })(i);
         }
      }
      

  3.   

    那为什么i这个局部变量没有消失呢??
    官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。闭包的特点:
      1.作为一个函数变量的一个引用,当函数返回时,其处于激活状态。
      2.一个闭包就是当一个函数返回时,一个没有释放资源的栈区。
      简单的说,javascript允许使用内部函数---即函数定义和函数表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。