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

时间:2017-04-19 18:59:06

标签: javascript callstack

给出这样的功能。 。

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

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

还有像这样的尝试捕获情况。 。

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是一种替代方案,但成功时这样的调用将不再需要间歇性地检查。

1 个答案:

答案 0 :(得分:2)

这两种功能都不会耗尽资源;实际上没有发生递归,因为浏览器异步调用传递给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()
}
&#13;
&#13;
&#13;