【问题标题】:Javascript recursive function returning undefined instead of expected result [duplicate]Javascript递归函数返回未定义而不是预期结果[重复]
【发布时间】:2017-02-07 18:40:56
【问题描述】:

我在 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 Fiddle 链接:https://jsfiddle.net/3naLztoa/2/

【问题讨论】:

标签: javascript recursion return


【解决方案1】:

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;
    }
}

【讨论】:

    【解决方案2】:

    @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));
    <body>
      <p id="result">
    
      </p>
    </body>

    【讨论】:

      猜你喜欢
      • 2016-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-25
      • 1970-01-01
      • 2018-12-05
      • 2021-04-11
      • 1970-01-01
      相关资源
      最近更新 更多