[問題] 關於Closure Garbage Collection疑問

看板Ajax作者 (chieh)時間9年前 (2014/07/31 22:40), 9年前編輯推噓1(104)
留言5則, 1人參與, 最新討論串1/1
大家好, 最近在看下面的Closure和Google JS Style Guide的Closure時 有一些疑問想請教大家 http://jibbering.com/faq/notes/closures/ http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml#Closures Google Guide裡Closure不好的範例中說, 在函式內設定的onclick裡雖然沒有用到element, 但形成的Closure Scope chain中, 依然會refer到這個element 那麼下面的程式中, obj.fn內只有用到a, 用偵錯在debugger處停下時, 在監看式中看b會是undefined, 這樣b是否依然保持著被refer, 存在於obj.fn上層的Scope chain? 或者他已經是處於可以(已)被回收的狀態呢? (function () { var a = 1, b = 2; obj.fn = function () { debugger; var x = a + 3; }; } ()); 另外, 在jQuery物件使用上, 在$elem.remove()後, jQuery物件的數字key依然保持DOM Element的關聯 如下面的程式中, 創建了一個jQuery物件並加入到body, 隨後馬上remove, 但因為被關聯於$elem變數, 所以隨時可以被append回DOM, 這樣是否表示在$elem設為null前, $elem下的DOM Element都不會被回收? var $elem = $('<div>').appendTo('body'); $elem.remove(); ... $elem.appendTo('body); 另外上面的疑問套用在Closure情境中時, (function () { var $elem = $('<div>').appendTo('body'); $elem.on('click', function () { //假設這邊不是用$(this)取得$elem, //而是直接使用$elem變數的話, //是否會發生Google Guide中Closure裡所說的循環參考的情況, //進而造成$elem無法被回收? }); } ()); 以上是小弟在看這2份文件的Closure時產生的疑問, 請大家幫小弟解答, 謝謝^^ -- 我先看一下妳的報告 醫生~我得什麼病阿 ◢◤ 天阿~這沒有藥能醫阿.. ◢██◣ ◢██◣ ◢◤◢██◣(碰!暈倒) █ ◥ ◤◥◥ ψQSWEET ◢◤ █ ◥ □︵□ ● ● ◢◤ □︵□ 公主病沒藥醫阿~ ︵◢ █▌ ◢◤ □◢ +  ̄ ̄v ◢◤ + -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.44.132.181 ※ 文章網址: http://www.ptt.cc/bbs/Ajax/M.1406817629.A.B06.html ※ 編輯: chieh0919 (114.44.132.181), 07/31/2014 22:45:37

08/02 09:33, , 1F
你第二個就是普通closure吧可以被回收
08/02 09:33, 1F

08/02 09:35, , 2F
Google的是假如我呼叫foo( myEle );然後myEle = null;
08/02 09:35, 2F

08/02 09:40, , 3F
myEle指到的物件不會被回收因為他被foo裡的element指到
08/02 09:40, 3F

08/02 09:41, , 4F
第一個的話b不被用到,所以function執行完就回收
08/02 09:41, 4F

08/02 10:03, , 5F
第一個不太確定就是或是跟browser有關?
08/02 10:03, 5F
文章代碼(AID): #1JsbLTi6 (Ajax)