[問題] 關於Closure Garbage Collection疑問

作者: chieh0919 (chieh)   2014-07-31 22:40:20
大家好, 最近在看下面的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時產生的疑問,
請大家幫小弟解答, 謝謝^^
作者: sean2449 (肉鬆)   2014-08-02 09:33:00
你第二個就是普通closure吧可以被回收Google的是假如我呼叫foo( myEle );然後myEle = null;myEle指到的物件不會被回收因為他被foo裡的element指到第一個的話b不被用到,所以function執行完就回收第一個不太確定就是或是跟browser有關?

Links booklink

Contact Us: admin [ a t ] ucptt.com