簡體   English   中英

可以在閉包中調用setTimeout導致內存泄漏嗎?

[英]Can calling setTimeout in a closure cause a memory leak?

我有一個第三方JavaScript對象,在該對象上我將其稱為“搜索”方法,並傳遞搜索查詢字符串以及在搜索完成后要執行的函數。 然后,該第三方對象消失並嘗試從服務中檢索數據。 如果服務調用未能在10秒鍾內返回,則第三方對象會記錄超時錯誤,但不幸的是不會以“超時”或其他適用的狀態執行回調函數。

為了使超時時執行回調,我按照下面的代碼包裝了第三方對象調用:

var SEARCH_TIMEOUT_MILLISECONDS = 10500;

var thirdPartyObject = ... // Global variable

function search(searchTerm, onCompleteCallback) {

    var searchTimeoutHandler = setTimeout(function () {
        onCompleteCallback(null, 'TIMEOUT');
    }, SEARCH_TIMEOUT_MILLISECONDS);

    thirdPartyObject.search({
        searchTerm: searchTerm,
        onComplete: function (searchResponse, status) {

            clearTimeout(searchTimeoutHandler);

            onCompleteCallback(searchResponse, status);
        }
    });
}

在創建閉包的地方,如果該函數被調用了數百次(並發),那么在setTimeout函數被調用或不被調用的情況下,是否會出現任何內存問題?

不,不應該有任何內存泄漏。 就超時而言,只有兩種情況:

  • 調用超時處理程序,之后將其垃圾回收。
  • 清除超時,之后也將對其進行垃圾回收。

但是,如果您執行了數百次多次搜索,那么這些超時處理程序可能會堆積起來,但最終將被清除(最多執行n * SEARCH_TIMEOUT_MILLISECONDS ,其中n是已調用search的次數,這也是您將擁有的超時處理程序的實例數)。 因此,本質上沒有內存泄漏,但是您可以堆積很多東西。 您可能需要調整SEARCH_TIMEOUT_MILLISECONDS變量,以免發生任何事情。 您還可以在Chrome開發者工具上查看內存使用情況,以查看已用完多少內存。

暫無
暫無

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

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