运行以下代码时:
(function recur() {
recur()
})()
出现以下错误-
未捕获的RangeError:超出了最大调用堆栈大小
-堆栈中填充了对函数(recur
)的引用。
那么为什么要执行以下代码:
(function recur() {
try {
recur()
} catch (error) {
recur()
}
})()
即使错误被捕获在try
块中,还是不是返回错误在catch
块中?或至少抱怨函数溢出了调用堆栈?
代码运行时,它会暂停所有其他非异步代码的执行,但是仍然...没有错误? 这是怎么回事?
编辑:
这种行为在这样的代码中特别奇怪:
(function notRecur() {
try {
Symbol() + 2
} catch (error) {
Symbol() + 2
}
})()
在执行时返回TypeError
。
这是另一个需要尝试的问题,感谢您通读并回复。
答案 0 :(得分:2)
您将捕获到minikube start --memory 4096
个异常的无限循环。
它将在RangeError
块内执行recur
调用,直到超过最大调用堆栈大小为止。此后,将try
块首次执行并再次调用catch
-导致recur
异常-被捕获在RangeError
块中,依此类推。>
为直观显示,您可以在开始递归之前在catch
块中 打印堆栈跟踪:
catch
答案 1 :(得分:2)
如果您进行了无数次递归,则调用堆栈将被填满,直到达到内存限制并崩溃为止,在这种情况下,错误会冒出并消除堆栈:
call > call > call > call > call > | memory limit
<----------------------------- error
现在,您直接捕获并重试:
call > call > call > call > call | memory limit
< error |
> call |
< error |
> call |
< error |
> call |
...
尽管看起来很奇怪,但它不会填满内存。但是,它会阻塞浏览器线程,因此浏览器可能会在一段时间后杀死整个线程。