为什么这个递归的javascript函数返回undefined?

时间:2018-05-01 15:28:04

标签: javascript function recursion undefined

在下面的递归函数中,我希望函数在结尾处返回"arrived",而是返回undefined。当执行进入if块时,代码应该返回?感谢您对此的评论。

function myFun(i){
    if(i===0){return ('arrived');}
    i = i - 1;
    myFun(i);
}

如果我更改代码如下,那么它将返回"arrived",但仍然不知道为什么上述代码不会返回"arrived"

function myFun(i){
    if(i===0){return ('arrived');}
    i = i - 1;
    return myFun(i);
}

2 个答案:

答案 0 :(得分:7)

第一个函数不返回值,因为所有代码路径必须返回一个值。在第一行之后,没有return语句。它仅在使用0作为参数调用时返回值。

答案 1 :(得分:1)

递归是一种功能性遗产,因此以函数式编写程序将产生最佳结果。

这意味着要避免像

这样的事情
  • 不返回值的命令式样式语句forifswitch
  • 突变或变量重新分配,如i = i + 1



const myFun = i =>
  i === 0
    ? "arrived"
    : myFun (i - 1)
    
console.log (myFun (10))
// "arrived"




与语句不同,通知表达式计算为值。我们做了以下更改

  • function声明function myFun (i) { ... }已替换为函数表达式 myFun (i) => ...
  • if语句已替换为三元表达式,例如condition ? ifTrue : ifFalse
  • 变量赋值语句i = i - 1; myFun(i)已替换为表达式 myFun(i - 1)

注意,return语句本身是一个副作用,在函数式JavaScript程序中几乎没用。

在这里继续其他答案,所有代码路径都必须返回一个值!以函数式编写程序的一个优点是,您不能编写一个不返回值的函数,也不能只用一个分支编写条件。

TL; DR:使用功能样式,您的问题自动消失