递归时的范围怪异

时间:2012-09-23 16:00:03

标签: javascript recursion

我只是漫无目的地玩,我偶然发现了一些我没有得到的东西。

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 ...?

我可能只是选择性失明发作,但我真的不知道范围误入歧途。

2 个答案:

答案 0 :(得分:4)

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

您应该从函数返回结果:

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

答案 1 :(得分:3)

如果Javascript函数退出而没有返回return语句,则其返回值将为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); // <----
}

代替?