2011-11-14 116 views
3

jQuery(JavaScript)和gc如何工作?垃圾收集和jQuery?

callBack是一個作爲JSON響應回調運行的函數。

當callBack函數執行時,內存中的內容是什麼?

我想聽到的是數據對象和autoCompleteData將被垃圾收集。只有存儲在$("input#reciever")中的數據駐留在內存中。

這是這種情況?

//The code in question: 

var callBack = function(data) { 
    var autoCompleteData = jQuery.map(data.receivers, function(receiver, i){ 
      return {label: receiver.name, id: receiver.id }; 
    }); 

    $("input#reciever").autocomplete({ 
     source: autoCompleteData, 
     select: function(event, receiver) { 
      $("input#reciever").val(receiver.item.label); 
      $("input#recieverId").val(receiver.item.id); 
      return false; 
     } 

    }); 
} 
+0

相關問題:http://stackoverflow.com/q/864516/901048 – Blazemonger

回答

1

Javascript中的垃圾收集工作是通過釋放任何其他JavaScript代碼沒有引用的對象的內存來實現的。如果沒有人提及它,它就不能再被使用,因此它可以被安全地釋放。

對某個對象的引用可以來自一個變量,也可以來自仍處於活動狀態的執行範圍。

在上面的示例中,在等待.autocomplete()函數完成時,代碼中的所有內容仍處於範圍內,並且不會收集任何內容。這意味着autoCompleteData將被保留(而不是垃圾收集),直到.autocomplete()方法完全執行完畢。這是正常的,預計的,並且實際上在許多地方適當的功能需要。

作爲衡量該數據仍處於範圍之內的一個原因的衡量標準,變量autoCompleteData仍處於select回調函數的範圍之內。在select回調函數中引用該變量是合法和適當的。因此,JS引擎不能垃圾收集它,直到它不在範圍內,並且不能再被任何代碼引用。

在某些情況下,您可以通過顯式清除變量來使內存可用於垃圾回收。

例如,如果您調整了您這樣的代碼:

var callBack = function(data) { 
    $("input#reciever").autocomplete({ 
     source: jQuery.map(data.receivers, function(receiver, i){ 
      return {label: receiver.name, id: receiver.id };, 
     select: function(event, receiver) { 
      $("input#reciever").val(receiver.item.label); 
      $("input#recieverId").val(receiver.item.id); 
      return false; 
     } 

    }); 
} 

然後,自動完成數據只存在作爲參數傳遞給.autocomplete(),它可能有資格進行垃圾回收更快,因爲是無要求JS引擎保持該數據,直到選擇回調被調用爲以前。數據實際上是否實際被垃圾收集取決於.autocomplete()的內部實現是否將其存儲在某個地方,直到調用select方法。如果某個東西的大小是多少(大量數據),那麼大量的數據(大量的數據加起來就是幾百兆字節)。以千字節或甚至數百千字節爲單位,並且只有一個,因此,記憶是立即收集垃圾還是回調被調用的確切時間並不是真的那麼重要,因爲瀏覽器現在可以訪問合理數量的記憶如果你正在處理大量的數據或處理大量數據或者重複做某些事情併發生某種泄漏,這些都可能導致問題(特別是在移動設備上),但是像上面這樣的例子不太可能會導致一個問題,除非數據集相對於瀏覽器中可用的內存來說很大。

1

目標由JavaScript的引用傳遞,所以對象通過訪問autoCompleteData將那autocomplete插件使用相同的一個到達。

正因爲如此,該變量autoCompleteData不會被垃圾收集(但這不會有損於你的程序,因爲它是由自動完成插件需要。

data對象然而,應該被垃圾收集,如無它提供了一個參考,它已經超出了範圍

此外,重要的是要注意垃圾收集對jQuery的工作方式不同,它的行爲與跨JavaScript(和ofc,所有其他JavaScript框架)。

+0

如果我理解正確autocomplete插件不會循環通過我的autoCompleteData並設置內部參數,而是直接循環autoCompleteData對象直接每次按一個鍵時。如果是這種情況,我同意只有數據對象應該被垃圾收集。感謝關於插件如何工作的解釋。 – Farmor