RangeError未引发-JavaScript

时间:2018-09-03 20:16:57

标签: javascript

运行以下代码时:

(function recur() {
    recur()
})()

出现以下错误-

  

未捕获的RangeError:超出了最大调用堆栈大小

-堆栈中填充了对函数(recur)的引用。

那么为什么要执行以下代码:

(function recur() {
    try {
        recur()
     } catch (error) {
        recur()
     }
})()

即使错误被捕获在try块中,还是不是返回错误在catch块中?或至少抱怨函数溢出了调用堆栈

代码运行时,它会暂停所有其他非异步代码的执行,但是仍然...没有错误? 这是怎么回事?


编辑:

这种行为在这样的代码中特别奇怪:

(function notRecur() {
    try {
        Symbol() + 2
    } catch (error) {
        Symbol() + 2
    }
})()

在执行时返回TypeError

这是另一个需要尝试的问题,感谢您通读并回复。

2 个答案:

答案 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  |
                           ...

尽管看起来很奇怪,但它不会填满内存。但是,它会阻塞浏览器线程,因此浏览器可能会在一段时间后杀死整个线程。