最新消息:iOS编程开发交流群(6906921) ,Mac.Cocoa开发交流群(7758675) 欢迎iOS/macOS开发编程爱好及学习者加入!

javascript递归调用,递归函数

JavaScript 天狐 5617浏览 0评论

递归函数是一个函数通过名字调用自身的情况下构成的,说到递归调用最常见的就是求阶乘了:

这是一个经典的递归阶乘函数。虽然看起来没有问题,但下面的代码却可能导致出错。

以上代码先把factorial()函数保存在变量anotherFactorial中,然后将factorial变量设为null,结果指向原始函数的引用只剩下一个。但在接下来调用anotherFactorial()时候,由于函数内部必须要执行factorial() (num * factorial(num-1)),而factorial已经不再是函数,所以会导致出错。

还有一种情况就是当我们的代码文档很复杂的时候,重命名一个递归函数,而忘记了修改实现中调用自身函数名的地方,也会导致报错

在这种情况下使用arguments.callee可以解决这个问题

我们知道arguments.callee是一个指向正在执行的函数的指针,因为可以用它来实现函数的递归调用,例如:

通过调用arguments.callee代替函数名,可以确保无论怎样调用函数都不会出问题,因此,在编写递归函数时,使用arguments.callee比使用函数名更保险一些。

但是在严格模式下,不能通过脚本访问arguments.callee,会导致错误,可以使用命名函数表达式来达成同样的效果。例如:

以上代码创建了一个名为f()的命名函数表达式,然后将它赋值给变量factorial。即便把函数赋值给了另外一个变量,函数的名字仍然有效,所以递归调用正确执行。这种方式在严格模式与非严格模式下都行得通

转载请注明:天狐博客 » javascript递归调用,递归函数

微信 OR 支付宝 扫描二维码
为天狐 打赏
非常感谢你的支持,哥会继续努力!
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址