我在JSFiddle上有以下功能:
function getRandomPointsInRange(range){
var x1 = rand(1, 40),
y1 = rand(1, 40),
x2 = rand(1, 40),
y2 = rand(1, 40),
result;
if(getDistance(x1, y1, x2, y2) < range){
console.log('test');
getRandomPointsInRange(range);
}else{
result = {x1: x1, y1: y1, x2: x2, y2: y2};
console.log(result);
return result;
}
}
它产生两个距离等于或大于特定距离的点(在这种情况下为20)。问题是有时函数会返回undefined
,而不是预期的结果。你无法在JS Fiddle上看到它,但是控制台日志显示只有当函数至少调用一次时(当undefined
被触发时),函数才会返回console.log('test')
。即使函数返回undefined
,结果本身实际上被定义为一个对象(第二个console.log显示了带有点坐标的正确对象)。为什么会发生这种情况以及如何解决这个问题,所以总会返回正确的对象?
JS小提琴链接:https://jsfiddle.net/3naLztoa/2/
答案 0 :(得分:2)
Prima vista,您需要另一个return
。
如果函数应该返回一个值,基本上递归函数在任何出口都需要一个值。如果你没有指定一个,你可以按设计undefined
。
为防止这种情况,您必须返回另一个递归函数调用的值。
function getRandomPointsInRange(range) {
var x1 = rand(1, 40),
y1 = rand(1, 40),
x2 = rand(1, 40),
y2 = rand(1, 40),
result;
if (getDistance(x1, y1, x2, y2) < range) {
console.log('test');
return getRandomPointsInRange(range);
// ^^^^
} else {
result = {x1: x1, y1: y1, x2: x2, y2: y2};
console.log(result);
return result;
}
}
答案 1 :(得分:0)
@Nina说,你需要另一个return
,并打印json JSON.stringify
来显示结果:
function getDistance(x1, y1, x2, y2) {
var result = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
return result;
};
function rand(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
};
function getRandomPointsInRange(range){
var x1 = rand(1, 40),
y1 = rand(1, 40),
x2 = rand(1, 40),
y2 = rand(1, 40),
result;
if(getDistance(x1, y1, x2, y2) < range){
return getRandomPointsInRange(range);
}else{
result = {x1: x1, y1: y1, x2: x2, y2: y2};
return result;
}
}
document.getElementById('result').innerHTML = JSON.stringify(getRandomPointsInRange(20));
&#13;
<body>
<p id="result">
</p>
</body>
&#13;