Javascript 如何查找/修复“超出最大调用堆栈大小”错误?

Javascript 如何查找/修复“超出最大调用堆栈大小”错误?,javascript,jquery,runtime-error,Javascript,Jquery,Runtime Error,我正在创建我自己的单词搜索游戏。我已经有了我需要的所有元素和部件,并且在一定程度上发挥了作用。当我使用递归函数来确定我可以将字母放在字典中的位置时,我会得到一个未捕获的RangeError:超出最大调用堆栈大小的错误。我做了一些挖掘,发现它与递归有关,但不确定如何修复它或错误到底是什么 我知道SO希望我在发布JSFIDLE链接之前发布代码,所以这里是我认为错误来自的代码片段,但整个游戏都在它下面的链接中。先谢谢你 _self.checkFit(_newRow, _newCol, _newID,

我正在创建我自己的单词搜索游戏。我已经有了我需要的所有元素和部件,并且在一定程度上发挥了作用。当我使用递归函数来确定我可以将字母放在字典中的位置时,我会得到一个未捕获的RangeError:超出最大调用堆栈大小的错误。我做了一些挖掘,发现它与递归有关,但不确定如何修复它或错误到底是什么

我知道SO希望我在发布JSFIDLE链接之前发布代码,所以这里是我认为错误来自的代码片段,但整个游戏都在它下面的链接中。先谢谢你

_self.checkFit(_newRow, _newCol, _newID, text);
我将我的全部代码放在JSFIDLE上:

更新:大家好,很抱歉花了这么长时间才回复。问题在checkFit功能中。我在电路板上随机生成一个坐标块,检查放置块是否支持单词,或者是否超出范围。如果超出范围,我会随机生成一个新的坐标并再次调用相同的函数。正是在这一点上发生了错误。遗憾的是,确实存在大量的递归,因为生成的随机数/坐标可能是使代码超出范围的任何东西。每次阵列超出范围时,我都会尝试清除它。仅仅访问阵列是否会导致此错误?唯一出现错误的地方是第133-182行,这是checkFit函数。几乎所有其他功能都按预期运行。我还有更多的东西要补充,以巩固它,但目前这个错误已难倒我。我不知道为什么会这样。我将更新我遇到问题的原始代码部分

checkFit : function(row, col, id, text){
    var _self = this;
    var _tmpArr = text.split("");
    var _spaceHTML = "";
    var _canFit = 0;
    var _newRow = 0;
    var _newCol = 0;
    var _newID = id;
    var _arrSequence = new Array();

    for(x in _tmpArr){
        if($('#'+_newID).length){
            _spaceHTML = $('#'+_newID).html();
            if((_spaceHTML == "") || (_spaceHTML == _tmpArr[x])){
                if(_arrSequence.indexOf(_newID) < 0){
                    _canFit++;
                    _arrSequence.push(_newID);
                } else {
                    _arrSequence.length = 0;
                    break;
                }
            } else {
                _arrSequence.length = 0;
                break;
            }
            var _newCoord = _newID.split("");
            _newRow = parseInt(_newCoord[0]) + row;
            _newCol = parseInt(_newCoord[1]) + col;
            _newID = _newRow.toString() + "" + _newCol.toString();
        } else {
            _arrSequence.length = 0;
            break;
        }
    }

    if(_canFit < text.length){
        _arrSequence.length = 0;
        _newRow = _self.getRandomRow();
        _newCol = _self.getRandomCol();
        _newID = _newRow.toString() + "" + _newCol.toString();
        try{
            _self.checkFit(_newRow, _newCol, _newID, text);
        } catch (ex){
            console.log(ex);
        }
    } else {
        _self.addTerms(_newRow, _newCol, _arrSequence, text);
        _arrSequence.length = 0;
    }
}

您应该在这里发布代码的所有相关部分,而不仅仅是一行,因为这不会有帮助。提琴是用于演示的,不是源代码参考。你的提琴里有很多代码。你有没有可能复制这个问题,然后发布代码。我已经说过了,如果出现错误,我预计递归会出现问题。要么你的代码陷入无限递归,要么你试图做太多的工作,很难理解这么多的代码。你是不是让单词随机出现在黑板上?那么checkFit检查这个词是否适合那里?如果这个词不适合任何地方怎么办?如果在这行代码之前执行console.trace,您将在浏览器控制台中看到大量循环!这就解释了为什么您超出了调用堆栈@seroth如果您用一个不启动递归函数的循环替换递归调用,那么是的。将递归调用的逻辑转换为循环的逻辑并不总是一件容易的任务,但它总是可能的,反之亦然。由于循环不会递归地调用函数,因此堆栈溢出不可能发生,因为在代码循环时,首先不会在调用堆栈上放置任何内容。