通过setTimout调用自身的函数会导致溢出吗?

Can a function that calls itself through setTimout lead to overflow?

给出这样的函数。 . .

function self_time() {
  console.log('hi');
  setTimeout(self_time, 1000);
}

这会导致堆栈溢出吗?我知道这不完全是递归调用并且 javascript 是异步的,但是这样 运行 可以无限期地不耗尽资源吗?

还有像这样的 try-catch 情况呢。 . .

function try_it() {
  try {
    console.log('im trying something...');
  } catch(e) { 
    //i failed so im going to try again in 1 second
    setTimeout(try_it, 1000);
  }
}

说函数无限期失败,它会 运行 资源不足吗?

我知道 setInterval 是另一种选择,但成功时这样的调用将不再需要间歇性地检查。

这两个函数都不会 运行 资源不足;实际上并没有发生递归,因为浏览器异步调用传递给 setTimeout 的函数。但是,您可以通过滚动自己的 attemptEvery 实用程序使您的逻辑更清晰一些,正如我在下面所做的那样:

function attemptEvery (ms, fn) {
  var token = setInterval(function () {
    try {
      fn.apply(this, [].slice.call(arguments, 2))
      clearInterval(token)
    } catch (e) {}
  }, ms)
}

attemptEvery(100, function () {

    dangerousOperation()
    console.log('Success!')
})

function dangerousOperation () {
    console.log('Attempting dangerous operation!')
    if (Math.random() < .6) throw Error()
}