Javascript递归函数返回undefined而不是预期的结果

时间:2016-09-29 12:24:50

标签: javascript recursion return

我在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/

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来显示结果:

&#13;
&#13;
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;
&#13;
&#13;