简单函数返回'undefined'值

Raj*_*amy 8 javascript recursion

这是我目前正在进行的功能:

function getSmallestDivisor(xVal) {    

    if (xVal % 2 === 0) {
        return 2;
    } else if (xVal % 3 === 0) {
        return 3;
    } else {
        var xSqrt = Math.sqrt(xVal);

        if (xSqrt % 1 === 0) {
            getSmallestDivisor(xSqrt);
        } else { 
            return xVal;
        }
    }

}

alert(getSmallestDivisor(121));
Run Code Online (Sandbox Code Playgroud)

我设计了上面的函数来返回整数的最小除数.考虑这个案子121.它应该实际返回11当前的上下文.但它正在回归undefined.

我检查了递归调用发生的次数; 他们实际上发生了两次.我记录了xVal这两个不同调用的值,并显示12111.我真的很困惑这个函数目前正在返回的原因undefined.

我创建了一个jsfiddle演示.

Set*_*day 25

其他人给出了正确的答案,但我想明确原因,因为对某些人来说可能并不明显(不是针对OP).

功能只不过是计算机采取的一系列步骤.

这称为函数调用:

getSmallestDivisor(121)
Run Code Online (Sandbox Code Playgroud)

无论何时使用该return关键字,该函数都会停止并该返回单词之后的任何内容替换函数调用(它可能没有任何内容).

所以在这种情况下,原始函数的问题是当脚本到达这一行时......

getSmallestDivisor(xSqrt);
Run Code Online (Sandbox Code Playgroud)

...它返回11到函数调用,它永远不会返回到内部发生的原始函数调用alert().

所以解决方案只是return在它自己调用的那个之前添加一个.

return getSmallestDivisor(xSqrt);
Run Code Online (Sandbox Code Playgroud)

这是递归函数时常见的错误.帮助弄清楚发生了什么的好方法是广泛使用浏览器控制台.

function getSmallestDivisor(xVal) {    
    console.log("This is xVal: " + xVal);
    if (xVal % 2 === 0) {
        console.log("xVal % 2 === 0 was true");
        return 2;
    }
    else if (xVal % 3 === 0) {
        console.log("xVal % 3 === 0 was true");
        return 3;
    }
    else {
        console.log("This is else.");
        var xSqrt = Math.sqrt(xVal);
        console.log("This is xSqrt of xVal: " + xSqrt);
        if (xSqrt % 1 === 0) {
            console.log("xSqrt % 1 === 0 was true... recursing with xSqrt!!!");
            getSmallestDivisor(xSqrt);
        }
        else {
            console.log("This is the else inside of else. I am returning: " + xVal);
            return xVal;
        }
    }
}
var y = getSmallestDivisor(121);
console.log("This is y: " + y);
Run Code Online (Sandbox Code Playgroud)

现在在您的浏览器中,您可以打开控制台(Chrome/Mac上的Option + Command + J)并观察正在发生的事情 - 执行哪些部分等.


Aru*_*hny 22

if (xSqrt % 1 === 0) {
    return getSmallestDivisor(xSqrt); // missing return here
} else {
    return xVal;
}
Run Code Online (Sandbox Code Playgroud)

演示:小提琴

  • 您可以使用三元:`return xSqrt % 1 === 0 ? getSmallestDivisor(xSqrt) : xVal;` [演示](http://jsfiddle.net/0rjgovqv) (3认同)