[英]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.