递归setTimeout是否会导致堆栈信息内存泄漏?

时间:2019-07-09 11:26:43

标签: javascript recursion memory-leaks settimeout

我有以下情况:

let func = () => {
  //...
  let id = setTimeout(() => {
    console.trace();
    clearTimeout(id);
    func();
  }, 2000);
}

func();

尽管我读到清除超时句柄将释放用于关闭的内存和处理程序本身,但我仍然很好奇堆栈信息是否可能泄漏。我故意放console.trace()调用,看起来堆栈信息无限期地增长。这不是问题吗?我知道它不是在类似递归的堆栈上,在那里我们可能会遇到堆栈大小异常,但是我仍然担心堆栈信息会不断增长。

1 个答案:

答案 0 :(得分:0)

不。 func完成执行后,堆栈展开。

如果func是递归的,则堆栈看起来像:

   [init] -> func -> func -> func -> func -> func -> .... 

对于您而言,它是:

  [init] -> func -> setTimeout
       <----     <----

  [timer] -> func -> setTimeout
      <----      <----

  [timer] -> func -> setTimeout
      <----      <----

  ...