0

我只是漫无目的地玩,我偶然发现了一些我不明白的东西。

var result;
// [.............. more stuff ..............]
function iterate(n) {
 if (isDivisor(n)) {
   if (checkIfPrime(n)) {
        result = n;
        return result;
   }
   iterate(n-2);
 }
 iterate(n-2);
}

result = iterate(startN)
console.warn("result is ", result)

//(isDivisor() and checkIfPrime() omitted because irrelevant to the problem

因此,代码工作正常,在限制意义上,一旦达到预期值,递归就会停止。但!在我得到的控制台中undefinedresult是一个全局的,不会在任何函数内部重新声明,特别是在iterate(). n返回时具有正确的值iterate()iterate()可以访问全局范围(并融入其中) 那么,它怎么可能导致undefined......?

我可能只是进行了选择性失明攻击,但我真的看不到范围误入歧途。

4

2 回答 2

4

您的函数返回未定义,并且您将其结果分配给结果变量。

您应该从函数返回结果:

function iterate(n) {
 if (isDivisor(n)) {
   if (checkIfPrime(n)) {
        return n;
   }
   return iterate(n-2);
 }
 return iterate(n-2);
}

var result = iterate(startN);
console.log(result);
于 2012-09-23T16:04:28.833 回答
3

如果 Javascript 函数在没有返回语句的情况下退出,它的返回值将是undefined. 这将发生在您的功能上,除非您拥有isDivisor(n)并且checkIfPrime(n)两者都是真实的。

也许你打算做

function iterate(n) {
 if (isDivisor(n)) {
   if (checkIfPrime(n)) {
        result = n;
        return result;
   }
   return iterate(n-2); // <----
 }
 return iterate(n-2); // <----
}

反而?

于 2012-09-23T16:03:49.667 回答