首页 > 解决方案 > try/catch - 多少递归调用?调用堆栈大小循环

问题描述

我有这个函数,我想在不停止脚本的情况下循环。但是当我使用“console.log”时,该功能停止。如果我删除它,该功能将继续。

超过堆栈大小后如何使此功能继续?

var i = 0;
function computeMaxCallStackSize() {
    try {
        i++;
        console.log(i);
        //some function to execute
        computeMaxCallStackSize();
    } catch (e) {
        //'e' is the error when max stack exceeds
        // setTimeout() is to wait before calling the function
        // if stack size exceeds it recalls the function
        setTimeout(computeMaxCallStackSize(), 0);
    }
}
computeMaxCallStackSize();

编辑: 此函数将导致堆栈溢出并继续。

var a = 1;
var b = 8769; //stack size
func(a);
    function func(a) {
        try {
            console.log(a);
            if(a % b === 0){
                setTimeout( function() {func(a+1); }, 0);
            } else {

                func(a+1);
            }
            
        } catch (e) {
            console.error(e);
            setTimeout( function() {func(a); }, 1);
        }
    }

标签: javascriptnode.js

解决方案


如果我删除它,该功能将继续。

不,它不会,它也会完成,但要晚得多。console.log()占用更多资源导致它需要在控制台中呈现文本,因此它可以更快地到达调用堆栈。

您刚刚创建了无限循环,它将一直运行到浏览器内存不足。


推荐阅读