在递归函数中使用Javascript计时器时是否释放了它们?

在递归函数中使用Javascript计时器时是否释放了它们?,javascript,recursion,settimeout,Javascript,Recursion,Settimeout,我遇到了下面的代码,其中递归调用setTimeout,直到window。value不可为空: const process = () => { return new Promise(resolve => { (function checkScriptParsed(self) { self.timer = window.setTimeout(() => { if (window.value) { clearTimeout(

我遇到了下面的代码,其中递归调用
setTimeout
,直到
window。value
不可为空:

const process = () => {
  return new Promise(resolve => {
    (function checkScriptParsed(self) {
      self.timer = window.setTimeout(() => {
        if (window.value) {
          clearTimeout(self.timer);
          resolve();
        } else {
          checkScriptParsed(self);
        }
      }, 50);
    })({});
  });
};

我的问题是,如果
window.value
在00:00:00后50毫秒不可为空,并且每毫秒生成一个计时器,那么在00:00:00后50毫秒是否会有49个活动计时器运行?

否,一次只有一个计时器处于活动状态,因为
setTimeout
是一次性的:与
setInterval
不同,它不会再次启动自身。事实上,这条线

clearTimeout(self.timer);
这是垃圾,因为当调用计时器时,计时器已经完成,不需要清理

该代码似乎是一个过于复杂的版本,类似于

const process = () => {
  return new Promise(resolve => {
    const timer = setInterval( () => {
      if (window.value) {
        clearInterval(timer);
        resolve();
      } 
     }, 50);
  });
};

即便如此,异步加载脚本上的
加载事件处理程序可能是检测脚本是否已被解析的更好方法。

不,一次只有一个计时器。这段代码每50秒检查一次解析的脚本。如果是1ms,那么每1ms就有一个计时器。重要的是50ms是函数调用之间的空闲时间。函数执行时间也会增加。此外,几乎总是有更好的方法等待变量。您可能应该首先添加为什么要使用该代码。