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