日期:2014-05-16  浏览次数:20467 次

基础问题,以下js函数中,闭包i不会被保存,那么x这个变量被存在哪里了?

function f()
{
var a=[];
var i;
for(i = 0;i <3;i++)
{
a[i]=(function(x){
return function()
{
return x;
}
})(i);
}
return a;
}
var a=f();
a[0]()
,以下js函数中,闭包i不会被保存,那么x这个变量被存在哪里了?
------解决方案--------------------
i 会保存啊,你照样可以取到 i 的值,只是取到的值,有些差别而已。只是作用域不同而已。

这里你要先理解一下作用域的问题了。

可以查看:闭包和作用域的关系
------解决方案--------------------
这里使用了立即执行函数,x是立即执行函数内部的变量,是一个单独的作用域,每一个立即执行函数返回的function中有于x的使用,则会保存该作用域。
------解决方案--------------------
不知道楼主的基础怎么样。所以我决定从基础回答这个问题:
一、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  

不知道说清楚了没有,有问题再讨论哈