2012-01-05 36 views
9

我的一位同事總是將自己的jQuery的變量爲null,有效地處理他們,一旦他們有完成,e.g:你應該拋棄jQuery對象嗎?

var bigThing = $(body); 
// ... 
// Do some stuff 
// ... 
bigThing = null; 

是不是真的有必要嗎?

+0

可能的重複[在不再需要變量時將變量設置爲null是否很好?](http:// stackoverflow。com/questions/7189809/javascript-set-value-null) – 2012-01-05 09:24:04

+0

謝謝,是的,這個問題確實非常相似,並且有一個很好的答案。 – Jay 2012-01-09 16:20:19

回答

8

如果將代碼封裝到函數中,那麼函數完成後就不需要這些函數,否則在其他地方沒有引用它們時,局部變量將被終止。

握住選擇/變量(緩存)如果你需要一遍又一遍地選擇同樣的事情再次與只有一次選擇它,並保持變量可能有一定的積極作用壽。

0

雖然不是完全必要的,但可以這樣做,以確保GC在下一次運行中清除它(無論如何,對於所有沒有1次引用的分配,它都會這樣做)。

在您的例子雖然,$(體)對象(jQuery的擴展對象,而不是DOM body對象)也會在設置bigThing其他任何事情(不一定爲null)

2

這是沒有必要清除,但很好的習慣,刪除參考和釋放內存

0

JavaScript有它自己的垃圾收集器。所以,看起來你不需要明確地處理這些對象。

但是由於各種原因,比如垃圾回收器的不好實現等,可能會發生它們存在內存泄漏的情況。

通過顯式取消它們,您指定瀏覽器在下一次垃圾回收中必須清除此內存。

總而言之,雖然沒有必要這樣做,但是取消JQuery/javascript對象將是一個好習慣。

+5

我認爲「取消對象」是一個誤稱。你肯定無效的變量;該對象只是取消引用。 – PPvG 2012-01-05 09:24:07

2

簡短的回答:沒有這幾乎沒有必要的,如果你正在使用jQuery。

這取決於你用它做了什麼。如果您沒有將任何事件處理程序附加到DOM節點,則垃圾收集器將在不再引用它時清除它。

但即使您確實附加了事件處理程序,jQuery也會通過爲您分離所有事件處理程序來處理諸如.remove().empty()之類的函數。所以只要你使用jQuery與DOM進行交互,你就很安全。

沒有jQuery的,如果你已經附加一個事件處理程序的節點時,GC不會清除它,你已經移除了DOM樹的節點即使你不再有任何引用。這是因爲DOM節點包含對JavaScript對象的引用(即事件處理程序),反之亦然。這將跨兩個獨立的系統創建一個循環參考;大多數垃圾收集器都遇到了麻煩。

如需進一步閱讀,我將您指向Douglas Crockford's article on Memory Leaks