作者B9 (叶酸酸)
看板Ajax
标题Re: [ js ] closure 与 garbage collection 问题?
时间Sun Jun 19 09:49:41 2011
我再说明清楚我的想法好了@@
※ 引述《B9 (叶酸酸)》之铭言:
: javascript:(function()
: {
在 scope chain 最前端加上一个 call object 1
: // outer. //
: var cat = (function()
call object 1 加入 cat 这个变数
: {
在 scope chain 最前端再加上一个 call object 2
: // inner. //
: var closure =
call object 2 加入 closure 这个变数。
: {
: height: 3
call object 2 的 closure 变数加上 height 这个 property。
: };
: var cat =
call object 2 加入 cat 这个变数。
: {
: age: function(age)
call object 2 的 cat 变数加上 age 这个 property。
age property 指向一个 anonymous function。
anonymous function 指向 call object 2 的 closure 变数的 property age。
: {
: if (!arguments.length)
: return closure.age;
: closure.age = age;
: return this;
: }
: };
将 call object 2 的 cat 变数回传到 outer,并 assign 给
call object 1 的 cat 变数。
: return cat;
: })();
函数执行结束,开始对做 garbage collection。
call object 2 的可能性:
1. closure 在 anonymous function 中被 refer,所以不能被回收,
而 closure.height 跟 closure.age 都被 closure refer,所以不能回收,
最後 closure, closure.height, closure.age 都没有被回收。
2. closure 在 anonymous function 中没有被 refer,
因为 closure.age 回传的时候被 dereferencing,
closure 没有被 refer 所以被回收,closure 被回收,
表示 closure.height 也没有被 refer,所以也回收,最後只留下 closure.age。
: console.log( cat.age(3).age() );
: })();
请问答案是这两种情况其中之一吗?@@?
--
Oni devas ami animalojn. Ili estas tiel bongustaj.
One should love animals. They are so tasty.
每个人都应该爱动物,他们是如此美味。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 175.180.52.50
※ 编辑: B9 来自: 175.180.52.50 (06/19 09:52)
1F:推 sk1765:closure是一个物件 只要在cat function中 有closure的字样 06/19 09:59
2F:→ sk1765:不管closure内有没有property closure都不会不见 即使他是 06/19 10:00
3F:→ sk1765:空物件 所以1答案比较近似 都是 跟 age height 无关 06/19 10:01
4F:→ sk1765: ^^但是 06/19 10:02
5F:→ B9:ok,谢谢! 06/19 11:29