最近看了闭包,但是一直有疑问我先说说我的想法,请各位帮帮看看function a()
{
   var aa = 1;
   function b(){alert (aa++);}
   return b;
}
var c = a();
c();//返回1
c();//返回2在定义外部函数a的时候,a有个内部属性[[scope]]的值就是global;当执行a()的时候,会为a函数创建一个"Execution Context"对象,这个对象有个scope属性(我认为这就是"作用域链"),值为定义时a函数的内部属性[[scope]];之后,会创建一个”Activation“ Object(活动对象),这个对象会被推到"作用域链"的最前面;之后,定义b函数,b函数的[[scope]]属性的值就是a函数的作用域链(global + a的活动对象)a()函数执行完后,返回b函数给cc()执行的时候,b会创建一个Activation“ Object(活动对象),这个对象也有scope属性(b的作用域链),值为b的活动对象+a的活动对象+global
综上,所以b才能访问到a中的局部变量但我的问题就是 
1.a的 Execution Context不会被垃圾回收,那么b的Execution Context会不会被回收?2.当再次调用b的时候,返回了2,这是怎么回事?
   我的理解是  调用b的时候再创建了一个Execution Context对象,但因为a的Execution Context没有被回收,所以保存了变量的值,也就返回了2希望各位大神能帮我解答,小弟在此谢谢了

解决方案 »

  1.   

    你想得太复杂了。
    “综上,所以b才能访问到a中的局部变量”======因为b()是a()的子函数,自然就可以访问aa变量(子访问父)。
    普通函数是运行完就被垃圾收回,但闭包不会,因为需要相互依存,被保存在内存中。
    var c=a();//这只是简单的赋值变量【可以简单理解成c就是b()了】
    c();//第一次执行函数,很自然就是返回1;同时因aa++ 所以执行完后aa=2 并且保存在内存中。
    c();//第二次执行函数,自然返回2;同理之后aa=3又保存起来。