大家好, 最近在看下面的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時產生的疑問,
請大家幫小弟解答, 謝謝^^