关于嵌套函数的一个疑惑

第一种:
function fn(){
var x =5;
return{
getX: x,
setX:function(){x=arguments[0];}

};
};
var a = fn();
a.getX(); //5
a.setX(10);
a.getX: //5 为啥是5?!

第二种:
function fn2(){
var x =5;
return{
getX:function(return x;},
setX:function(){x=arguments[0];}

};
};
var b = fn2();
b.getX(); //5
b.setX(10);
b.getX: //10 这个貌似理解,第一种写法很困扰我

[color=blue][b]第一种写法中,getx是个属性, 而属性值是x的值, 即5, 所以 getX:x 和 getX:5是一样的[/b][/color]

[code="javascript"]getX: function(return x;}[/code] 函数级,返回自身的x对象,也就是fn2.x的内存地址
[code="javascript"]getX: x[/code] 相当于一个静态变量。

第一种写法相当于Java中的new 内部匿名类();即闭包特性。你是否碰到过在一个匿名类中访问类外部的变量,该变量必须为final的情况?这也就是为什么getX返回5,因为return返回的是一个匿名对象,该对象被fn封闭,而该对象又引用了局部变量x,JavaScript引擎发现这个封闭对象后,会自动为该对象创建一个闭包体,闭包体是一个完全封闭和独立的作用域。不会在return之后立刻被垃圾回收,只有当闭包体外部的引用全部为null时才被回收掉。