簡體   English   中英

Javascript:命名關閉和內存管理

[英]Javascript: named closure and memory management

我試圖了解有關JS中的內存管理的更多信息,而我對閉包有一些疑問。

情況1

// Suppose that object var is capable to emit events 
var object = new EventEmitter();

object.addEventListener('custom-event', function callback(event) {
    object.removeEventListener('custom-event', callback);
    object = null;

    //Do some heavy computation like opening a specific view or somehthing similar
    var heavy_window = new HeavyWindow();
    heavy_window.open();
});

情況2

// Suppose that object var is capable to emit events 
var object = new EventEmitter();

object.addEventListener('custom-event', callback = function(event) {
    object.removeEventListener('custom-event', callback);
    object = null;

    //Do some heavy computation like opening a specific view or somehthing similar
});

我的問題是:

  • 情況1:

    • 以為object一直保留在內存中,直到heavy_window沒有為空是正確的嗎?
    • 將閉包內的object var清空可以幫助gc嗎?
  • 情況2:

    • 以這種方式命名閉包...addEventListener(callback = function() {})而不是...addEventListener(function callback() {})會導致內存泄漏嗎? 聲明callback = function() {}是否會導致全局隱藏變量?

注意,我不需要jQuery或其他框架的示例。 我有興趣進一步了解JavaScript Vanilla。

先感謝您。

我認為ES規范中沒有指定垃圾收集的詳細信息。 但是,在大多數解釋器中,一旦不存在對對象的任何引用或無法訪問或在以后計划該對象,通常將對其進行垃圾回收。

在情況1中,如果將事件對象傳遞給HeavyWindow ,那么heavy_window可能可以訪問原始的new EventEmitterevent通常具有對事件目標的引用),因此,直到對您的所有引用進行引用之后,您的new EventEmitter()才可能被垃圾回收。 heavy_window不見了。 如果沒有,那么您的new EventEmitter將在將來的某個時刻被垃圾回收。

在情況2中,將回調函數分配給全局變量callback不會發生任何變化,因為回調函數沒有對您創建的實際new EventEmitter對象的引用。 (同樣,除非event引用了您創建的new EventEmitter對象。)

實際上,情況可能有所不同,因為瀏覽器中的垃圾收集器相當復雜。 解釋器在什么時候決定收集垃圾確實由其決定,但最重要的是,只有在對一個對象的所有引用都消失時,它才會這樣做。

內存管理通常並不是JavaScript真正關心的問題,您不必在大多數時間都在考慮它。 如果存在內存泄漏並且可以使用瀏覽器提供的開發人員工具檢測到它,您將知道它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM