这里使用了立即执行函数,x是立即执行函数内部的变量,是一个单独的作用域,每一个立即执行函数返回的function中有于x的使用,则会保存该作用域。

解决方案 »

  1.   

    不知道楼主的基础怎么样。所以我决定从基础回答这个问题:
    一、f() 函数只是一个普通的函数,其作用域中有两个变量  a 和 i 
    二、在最外层函数( f() )中,循环定义了匿名函数(匿名函数A function (x) { }(i);) (该函数可是立即执行了哟,把i 传值给了x 罢了):注意,这时候 x 就和 i 的值绑定在了一起。 
    三、匿名函数A作用域内有一个变量(x :: 亲,形参也是作用域中的变量哟 ),又声明了匿名函数B , 只不过该匿名函数被返回了并保存到了a数组中了而已。 
    四、匿名函数B 被返回后,仍然可以访问到外部函数(匿名函数A作用域中的 x),(人家return x ; 了嘛),这就是闭包了。
    五、所以 a[0] () ; // 为0  a[1] () ; // 为1 ,    而不是 a[0] () ; // 为3  a[1] () ; // 为3  不知道说清楚了没有,有问题再讨论哈