如何找出何时JavaScript堆栈完整



我有一种算法,该算法递归相对较深,因此最大堆栈大小超过了例外(而不是无尽的递归!(。

我的算法可以自行拆分,以便使用ASAP进行异步,但是每次执行执行速度都大大减慢。我想有一种(快速(的方法来找出当前的堆栈使用百分比,因此我的算法可以决定是否低于90%,继续同步,但是当它超过超过时,请继续保持异步。我知道这个值必须在内部存在,但是有没有办法访问它?

另一方面,我可以想象要捕获最大堆栈尺寸超过错误,但是我在这里读到,这是不可能的(为什么不呢?抛出此例外将意味着返回呼叫者,这实际上应该减少堆栈尺寸较旧的堆栈条目仍应完好无损吗???(

当然,一种方法是通过我的所有功能传递计数器变量,但这很尴尬。同样尚不清楚,我的堆栈在哪个计数器上为90%,因为我不知道,堆栈有多大,我的每个堆栈框架有多大。

因此,实际上,即使程序员可以避免使用他所需的信息,但JavaScript似乎天生就失败了,即/div>

没有办法通过沿着变量或可能指的是共享状态来测量当前的堆栈利用率。

但是,您 can 只需捕获呼叫堆栈溢出错误时即可。(您链接的不清楚的问题是在谈论其他问题,我写了一个新的答案来澄清。(您可以用它来大概对可用的堆栈尺寸进行大概的了解,但是对于不同的不同功能取决于优化和其他内容。

var maxDepth = 0;
function popTheStack() {
  maxDepth++;
  popTheStack();
}
try {
  popTheStack();
} catch (ex) {
  console.log("caught " + ex + " at depth " + maxDepth);
}

它取决于浏览器。您的方法不是解决问题的最佳选择,当然,我们不能向用户宣布"您的请求太重,我们无法处理"。 另一种方法是脱离算法,所有递归解决方案始终具有相应的非收集性溶液。您可以自己模拟堆栈,而不是系统堆栈,并实现循环以找到结果。

最新更新