在游戏中工作,无法弄清楚为什么我的功能无法正常工作..
未捕获RangeError:超出最大调用堆栈大小
据我所知,我的一个函数有一个无限循环(?)
我有一个数组女巫需要有3个随机速度。
var randomSpeeds = new Array();
我有一个功能,巫婆产生一个随机的速度:
function generateSpeed() {
var randomSpeed = Math.random().toFixed(1) * 5;
if(randomSpeed == 0){
randomSpeed = 1;
}
return randomSpeed;
}
该数组由此函数填充:
function fillSpeedArray() {
for(var i = 0; i < 3; i++) {
var randomSpeed = generateSpeed();
if(speedArrayChecker(randomSpeed) != false) {
randomSpeeds.splice(i, 0, randomSpeed);
} else {
fillSpeedArray();
}
}
}
该函数循环3次,每次产生随机速度,并通过if / else语句检查数组是否已经获得随机生成的数字(speedArrayChecker)。
speedArrayChecker:
function speedArrayChecker(speed) {
for(speeds in randomSpeeds) {
if(speeds != speed) {
return true;
}
}
return false;
}
这最后一个函数通过数组,如果数组已经是随机生成的数字,则返回true,否则返回false。
调用和检查函数:
fillSpeedArray();
console.log(randomSpeeds);
由于某种原因,我发现功能无法正常工作。 谢谢和问候。
答案 0 :(得分:1)
这里有一个无限循环(通过递归):
function fillSpeedArray() {
for(var i = 0; i < 3; i++) {
var randomSpeed = generateSpeed();
if(speedArrayChecker(randomSpeed) != false) {
randomSpeeds.splice(i, 0, randomSpeed);
} else {
fillSpeedArray();
}
}
}
在else
中,如果速度已经存在,它将一次又一次地调用它当前所处的功能。除非你第一次完美地获得3个随机速度,否则此功能永远不会退出。我建议将fillSpeedArray()
更改为i--
。
另外,请注意为什么不使用randomSpeeds.push(randomSpeed)
为阵列添加速度。
答案 1 :(得分:1)
<强>解决方案:强>
var randomSpeeds = new Array();
function generateSpeed() {
var randomSpeed = Math.random().toFixed(1) * 5;
if(randomSpeed == 0){
randomSpeed = 1;
}
return randomSpeed;
}
function fillSpeedArray() {
while (randomSpeeds.length < 3) {
var randomSpeed = generateSpeed();
if (speedArrayChecker(randomSpeed) != false) {
randomSpeeds.splice(randomSpeeds.length, 0, randomSpeed);
}
}
}
function speedArrayChecker(speed) {
return randomSpeeds.indexOf(speed) === -1
}
fillSpeedArray();
console.log(randomSpeeds);
<强>解释强>
您的代码存在两个问题。
speedArrayChecker
功能的实施存在根本缺陷。当false
为空时,它仅返回randomSpeeds
。解决方案是更正speedArrayChecker
实现并使用while
循环而不是for
循环。