【问题标题】:Why this recursive javascript function returns undefined?为什么这个递归 javascript 函数返回未定义?
【发布时间】:2018-05-01 15:28:03
【问题描述】:

在下面的递归函数中,我希望函数在最后返回"arrived",但它却返回undefined。这不是当执行进入if 块时代码应该返回吗?感谢您的 cmets。

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

【问题讨论】:

  • @anthony, i 在参数中发送
  • 如果你有一个函数foo,它只调用一个函数bar,它返回一个值"BAR",你会期望foo返回调用的结果吗? bar 如果foo 没有return 声明? function foo() { bar() } function bar() { return "bar" } foo();递归函数也不例外。
  • 你的例子完全有道理。谢谢!

标签: javascript function recursion undefined


【解决方案1】:

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

【讨论】:

  • 如果你调用函数myFun(5),那么它最终会到达myFun(0),此时它应该返回"arrived",对吧?所以,我的意思是如果我调用myFun(5),它与myFun(0) 直接调用带有参数0 的函数有什么不同?
  • 在这种情况下,您有 6 个嵌套(递归)调用。 第 6 次调用 使用 i === 0 完成,是的,它返回一个字符串到第五次调用的上下文。然后该值被“丢弃”,因为从第 5 次(以及第 4 次和第 3 次等)调用发生的位置,即第 3 行,没有 return 语句。
  • 现在我明白了,很好的解释,谢谢。
【解决方案2】:

递归是函数式的遗产,因此以函数式风格编写程序将产生最佳结果。

这意味着避免像

这样的事情
  • 命令式语句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:使用函数式风格,你的问题会自动消失

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 2014-08-28
    • 2017-01-21
    相关资源
    最近更新 更多