为什么返回未定义但console.log返回一个int?

Bre*_*ren 6 javascript recursion console.log

所以我有以下功能:

var multiplyT = function(a, b, acc) {

    if (b == 0) {
        console.log("BASE CASE: ", acc);

        return acc;
    } else {
        b--;
        acc = acc + a;
        console.log("NOT THE BASE CASE: ", a,b,acc);
        multiplyT(a, b, acc);
    }

}
Run Code Online (Sandbox Code Playgroud)

它被调用:

console.log(multiplyT(5,3,0));
Run Code Online (Sandbox Code Playgroud)

并给出这个:

NOT THE BASE CASE:  5 2 5
NOT THE BASE CASE:  5 1 10
NOT THE BASE CASE:  5 0 15
BASE CASE:  15
undefined
Run Code Online (Sandbox Code Playgroud)

作为输出.令我困惑的是为什么acc会为console.log提供正确的值,但根据返回的内容为"undefined".

Tre*_*xon 10

在你的else块中,它应该是 return multiplyT(a, b, acc);


Sea*_*son 6

这个不错.递归可以使你的头旋转.它未定义的原因是因为并非所有迭代都返回一个值,而对于那些没有返回值的那些,你会得到未定义的 - 就像你将一个变量设置为任何不返回值的函数一样.

然而,它会因递归而变得混乱,因为在这种情况下您看到的返回值来自第一次调用和最后完成的迭代.与常规方法调用不同的是,返回会中断方法的执行 - 将其从任何地方发送回来,递归仍然可以通过调用堆栈返回,返回它必须返回的任何值,包括undefined,反向他们被称为的顺序.所以它实际上给你的console.log调用了四个返回值:15,undefined,undefined,undefined.

因为它是同步的,所以console.log在它调用的方法完成之前无法执行.它输出的是它获得的最后一个值,或者是未定义的.如果你在else块中的方法调用后坚持返回,你会看到你得到5,或者在函数第一次迭代后得到acc的值.

var multiplyT = function(a, b, acc) {

  if (b == 0) {
    console.log("BASE CASE: ", acc);

    return acc;
  } else {
    b--;
    acc = acc + a;
    console.log("NOT THE BASE CASE: ", a,b,acc);
    multiplyT(a, b, acc);
    return acc;
  }
}
console.log(multiplyT(5,3,0));
Run Code Online (Sandbox Code Playgroud)


Aru*_*hny 5

您还需要从else块返回.

在你的情况下,即使acc更新的值,该值是mot返回时b != 0

var multiplyT = function(a, b, acc) {

  if (b == 0) {
    console.log("BASE CASE: ", acc);

    return acc;
  } else {
    b--;
    acc = acc + a;
    console.log("NOT THE BASE CASE: ", a, b, acc);
    return multiplyT(a, b, acc); //return here
  }

}

console.log(multiplyT(5, 3, 0));
Run Code Online (Sandbox Code Playgroud)