簡體   English   中英

如何修復JavaScript中的settimeout內存泄漏問題

[英]How to fix settimeout memory leak problem in javascript

我有這樣的JS功能

function check() {
    ...do something
}

現在,我想在腳本啟動時以及每天(每天00:00:01)開始時運行它。 我的代碼現在看起來像這樣

function check() {
    ...do something

    let today = new Date();
    let tomorrow = new Date();
        tomorrow.setHours(0,0,1,0);
        tomorrow.setDate(tomorrow.getDate()+1);

    console.log("next check in", tomorrow-today);
    setTimeout(() => { check() }, tomorrow-today);
}
check();

我在check()中使用setTimeout。 我認為這是不好的代碼,因為它將創建一個循環,並且函數check()將永遠不會被清理。 如何解決?

沒錯,由於堆棧無限期增長,不受控制的遞歸可能導致資源耗盡。 例如,以下的Javascript程序將在執行check()足夠多次而沒有先return情況下崩潰:

function check() {
  check();
}
check();

以下代碼不會以這種方式崩潰:

function check() {
  setTimeout(check, 1000);
}
check();

該代碼可以無限期地運行而不會耗盡堆棧,因為每次運行check() ,它都允許運行至完成並在以后運行之前return

之所以可行,是因為setTimeout()函數不會直接運行check() 相反,它告訴Javascript運行時將check()的執行安排在將來執行1秒。 當它和check()完成時,JavaScript堆棧變為空。 1s之后,只要清除了Javascript堆棧, check()的執行就會排隊,並最終執行

由於必須在運行check()之前清除Javascript堆棧,所以可以避免堆棧溢出。

您可以添加函數clearTimeout(timer):

let timer = setTimeout(() => check());

clearTimeout(timer);

暫無
暫無

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

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