Javascript 如何查找/修复“超出最大调用堆栈大小”错误?
我正在创建我自己的单词搜索游戏。我已经有了我需要的所有元素和部件,并且在一定程度上发挥了作用。当我使用递归函数来确定我可以将字母放在字典中的位置时,我会得到一个未捕获的RangeError:超出最大调用堆栈大小的错误。我做了一些挖掘,发现它与递归有关,但不确定如何修复它或错误到底是什么 我知道SO希望我在发布JSFIDLE链接之前发布代码,所以这里是我认为错误来自的代码片段,但整个游戏都在它下面的链接中。先谢谢你Javascript 如何查找/修复“超出最大调用堆栈大小”错误?,javascript,jquery,runtime-error,Javascript,Jquery,Runtime Error,我正在创建我自己的单词搜索游戏。我已经有了我需要的所有元素和部件,并且在一定程度上发挥了作用。当我使用递归函数来确定我可以将字母放在字典中的位置时,我会得到一个未捕获的RangeError:超出最大调用堆栈大小的错误。我做了一些挖掘,发现它与递归有关,但不确定如何修复它或错误到底是什么 我知道SO希望我在发布JSFIDLE链接之前发布代码,所以这里是我认为错误来自的代码片段,但整个游戏都在它下面的链接中。先谢谢你 _self.checkFit(_newRow, _newCol, _newID,
_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如果您用一个不启动递归函数的循环替换递归调用,那么是的。将递归调用的逻辑转换为循环的逻辑并不总是一件容易的任务,但它总是可能的,反之亦然。由于循环不会递归地调用函数,因此堆栈溢出不可能发生,因为在代码循环时,首先不会在调用堆栈上放置任何内容。