繁体   English   中英

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

[英]Why would a return be undefined but console.log return an int?

所以我有以下功能:

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

}

它被调用:

console.log(multiplyT(5,3,0));

并给出这个:

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

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

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

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

然而,它会因递归而变得混乱,因为在这种情况下您看到的返回值来自第一次调用和最后完成的迭代。 与常规方法调用不同的是,返回会中断方法的执行 - 将其从任何地方发送回来,递归仍然可以通过调用堆栈返回,返回它必须返回的任何值,包括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));

您还需要从else块返回。

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

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

你正在递归地调用multiplyT函数,但是你没有控制返回。 然后,multiplyT(5,3,0)在第一次调用中不返回值,然后函数返回undefined。

堆栈正在执行,但第一次调用更重要:它需要从返回最终值的递归内部函数中获取值。

修复else分支中的代码,以便返回递归调用:

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

我在处理我的一个项目时想出了一个很好的解决方案,我在其中遍历一个复杂的JSON对象,返回一些搜索id的数据。

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

在这里,我们运行一个while循环来查看递归函数调用是返回true值还是undefined。 如果返回undefined其他内容,它将返回数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM