最近看了闭包,但是一直有疑问我先说说我的想法,请各位帮帮看看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希望各位大神能帮我解答,小弟在此谢谢了
{
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希望各位大神能帮我解答,小弟在此谢谢了
“综上,所以b才能访问到a中的局部变量”======因为b()是a()的子函数,自然就可以访问aa变量(子访问父)。
普通函数是运行完就被垃圾收回,但闭包不会,因为需要相互依存,被保存在内存中。
var c=a();//这只是简单的赋值变量【可以简单理解成c就是b()了】
c();//第一次执行函数,很自然就是返回1;同时因aa++ 所以执行完后aa=2 并且保存在内存中。
c();//第二次执行函数,自然返回2;同理之后aa=3又保存起来。