繁体   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