[ js ] closure 與 garbage collection 問題?

看板Ajax作者 (葉酸酸)時間14年前 (2011/06/18 23:36), 編輯推噓1(106)
留言7則, 2人參與, 最新討論串1/2 (看更多)
我想請問在下面這個例子中,outer 所在的層級,closure.height 會不會被回收? 而 closure 又是否會被回收?@@ inner 這層的 cat object 被回傳到 outer 這層,而 cat.age 這 function 又 refer closure.age 這個變數,所以 closure.age 一定不會被回收。 closure.height 照理說沒有被 refer,到了 outer 曾經應該會被回收。 問題比較大的是 closure,照理說 closure 沒有被 refer,應該會被回收。 可是 closure 有個 property age 被 refer,這樣還能夠說 closure 沒有被 refer 嗎? 但理論上說起來,應該是可以被回收才對。不知道有沒有人知道這問題的答案? 或者可以提供找出答案的試驗方法?@@ // JSBin http://jsbin.com/ohudi5/2/edit#js // javascript:(function() { // outer. // var cat = (function() { // inner. // var closure = { height: 3 }; var cat = { age: function(age) { if (!arguments.length) return closure.age; closure.age = age; return this; } }; return cat; })(); 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/18 23:37)

06/19 01:30, , 1F
closure是 cat物件的一個私有物件 只有他能夠用 沒有回收的
06/19 01:30, 1F

06/19 01:32, , 2F
說法 他是一個private 這在 The Good Parts裡第五章
06/19 01:32, 2F

06/19 01:34, , 3F
第四種物件宣告方式 Functional模式 有詳細介紹 為什麼這樣
06/19 01:34, 3F

06/19 01:37, , 4F
建構物件 最後答案會是3
06/19 01:37, 4F


06/19 01:48, , 6F
另外,以scope chain來看,內部的closure是有被refer的
06/19 01:48, 6F

06/19 01:50, , 7F
而GC回收是依據有沒有被refer,這樣應該可以推出你要的答案@@
06/19 01:50, 7F
文章代碼(AID): #1D_CODmP (Ajax)
文章代碼(AID): #1D_CODmP (Ajax)