2017-04-01 63 views
0

嘿,我讀過Google文章(here),我們在使用閉包時需要小心。
例如,他們給有此功能:JavaScript的最佳實踐,使用閉包

function foo(element, a, b) { 
    element.onclick = function() { /* uses a and b */ }; 
} 

我引述:

功能關閉保持到元素的引用,a和b即使它永遠不會使用的元素。由於元素也保留了對閉包的引用,所以我們有一個循環不會被垃圾回收清理。

而且我還讀到一篇文章在module pattern,並且有大量的使用在封閉

例如,如果我宣佈一個這樣的模塊:

(function() { 
    var a = function() { }; 
    var b = function() { }; 
}()); 

所以b訪問到a,這意味着它也保存對模塊上聲明的所有函數的引用。

它也被認爲是不好的做法?

+0

這是一個比代碼特定的問題更多的討論。順便提一下,友好提示:reAd,而不是紅色:) – Utkanos

+0

@Utkanos - 實際上,我認爲這是一個代碼特定的問題,儘管我沒有足夠深入的JavaScript知識來回答它。我相信這個引用表明函數sans參數持有對整個封閉範圍的引用。這是否確實阻止了GC(除了在引用計數模型中它不應該),或者是否可以通過將'a'和'b'顯式傳遞給內函數來避免無意的引用,(我相信)這裏真正的問題。 – kdgregory

回答

1

是的,我們需要小心任何高級功能,但簡單的答案是他們可以發揮有用的作用。

閉包的目的是保留變量以備後用。如果你從不使用這些變量,那麼顯然你會不必要地掛在數據上。

JavaScript垃圾收集非常好,並且它越來越好。但是當你真的完成了一個變量的時候,它仍然需要努力解決,而且這不是通靈。

另一方面,使用閉包的最重要的部分是它們允許你定義有限範圍的變量,所以你可以減少你對全局變量的依賴,這肯定比一些額外的閉包變量更有問題。

閉包變量的真正問題不是它們消耗的額外內存,而是它們應用時的誤解。例如,許多新的JavaScript開發人員在找到循環變量時,在賦值後仍保留。

許多JavaScript開發人員用卡車裝載庫來擴充他們的代碼,這些庫會創建龐大而複雜的對象來執行簡單的任務。這將是一個更大的考慮成本。

簡短的回答是,明智地使用閉包是有價值的,並且往往是執行任務的最佳方式。

2

您引用的陳述是垃圾。

函數閉包保持對元素,a和b的引用,即使它從不使用元素。

No it doesn't

因爲元素還保留對閉包的引用,所以我們有一個循環不會被垃圾回收清理。

No they will

(1:我們往往忽視古代馬車互聯網探索者)

因此,要回答你的問題:不,這些都不是不好的做法。