如何确定Javascript堆栈何时已满?

如何确定Javascript堆栈何时已满?,javascript,stack-overflow,Javascript,Stack Overflow,我有一个算法,它递归地工作得相对深入,这样最终会出现超过最大堆栈大小的异常(而不是无休止的递归!) 我的算法可以自动拆分,使用asap异步进行,但是每次这样做都会大大降低执行速度。我希望有一个(快速)的方法来找出当前堆栈使用率百分比,这样我的算法可以决定在低于90%时同步继续,但在高于90%时异步继续。我知道这个值必须在内部存在,但有办法访问它吗 另一方面,我可以想象捕获超过最大堆栈大小的错误,但我认为这是不可能的(为什么不呢?抛出此异常意味着返回调用方,调用方实际上应该减少堆栈大小,并且旧的堆

我有一个算法,它递归地工作得相对深入,这样最终会出现超过最大堆栈大小的异常(而不是无休止的递归!)

我的算法可以自动拆分,使用asap异步进行,但是每次这样做都会大大降低执行速度。我希望有一个(快速)的方法来找出当前堆栈使用率百分比,这样我的算法可以决定在低于90%时同步继续,但在高于90%时异步继续。我知道这个值必须在内部存在,但有办法访问它吗

另一方面,我可以想象捕获超过最大堆栈大小的错误,但我认为这是不可能的(为什么不呢?抛出此异常意味着返回调用方,调用方实际上应该减少堆栈大小,并且旧的堆栈条目在执行此操作时应该保持完整???)

当然,一种方法是通过我的所有函数传递一个计数器变量,但这很尴尬。另外还不清楚,我的堆栈的计数器值是90%,因为我不知道堆栈有多大,每个堆栈帧有多大


因此,实际上,在这种情况下,JavaScript似乎生来就是失败的,即使程序员可以避免它,如果他能够访问他所需要的信息的话——这些信息存在于某个地方,但由于未知原因而被保密?

这取决于浏览器。您的方法不是解决问题的最佳选择,当然我们不能像“您的请求太重,我们无法处理”这样向用户宣布。
另一种方法是反递归算法,所有的递归解都会有相应的非递归解。您可以自己模拟堆栈,而不是系统堆栈,并实现循环以找到结果。

如果不亲自跟踪当前堆栈利用率,就无法通过传递变量或引用共享状态来测量当前堆栈利用率

但是,当调用堆栈溢出错误满时,您可以捕获它。(您链接的不清楚的问题是在谈论其他内容,)您可以使用此选项大致了解可用堆栈大小,但根据优化和其他内容,这可能无法保证不同函数的一致性

var maxDepth=0;
函数popTheStack(){
maxDepth++;
popTheStack();
}
试一试{
popTheStack();
}捕获(ex){
console.log(“捕获”+ex+“深度”+maxDepth);

}
请展示您的作品。这听起来像是算法的问题,而不是javascript解释器如何运行它。你在干什么?节点还是浏览器?你的算法到底想实现什么?我们需要这些细节。我不能提供“算法”——它处理数据并根据数据递归建立自己。我的算法没有问题。当数据结构嵌套得足够深时,实际上会发生这种情况,堆栈将在没有无休止的递归的情况下运行。如果您的递归太深以至于溢出堆栈,您需要重写您的算法,所以执行短尾递归。这写在我的问题中-我知道这一点。我可以分开,只是“什么时候”的问题。但是,正如您可以捕捉到的最大调用堆栈超出异常一样,“when”现在变得很容易了……这是一种处理此问题的可怕方法;正确编写算法;不要依靠古怪的系统怪癖来解决效率低下的问题。写得有防御性,而不是攻击性。对其他问题读得不够好。我将做一个jsperf,看看在我的算法中引入try-catch块对性能的影响有多大。