龙空技术网

带你走进JavaScript世界系列——递归

资深北漂假码农 219

前言:

现时看官们对“js递归的应用场景”大概比较关切,我们都想要学习一些“js递归的应用场景”的相关文章。那么小编也在网摘上汇集了一些有关“js递归的应用场景””的相关文章,希望各位老铁们能喜欢,你们一起来了解一下吧!

递归函数是在一个函数通过名字调用自身的情况下构成的,例:

一个简单的递归实现

上面的代码是一个经典的递归阶乘函数。虽然这个函数表面看没有问题,但是下面的代码却会导致它出错:

递归函数的问题

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

前面我们已经介绍过 arguments.callee 是一个指向正在执行的函数指针,因此可以用它来实现对函数的递归调用,例:

使用 arguments.callee 实现对函数的递归调用

以上代码通过使用 arguments.callee 代替函数名,可以确保无论怎样调用函数都不会出问题。但是在严格模式下,不能通过脚本访问 arguments.callee ,访问这个属性会导致错。不过,可以使用命名函数表达式来达成相同的结果。例:

使用命名函数表达式来替代 arguments.callee

以上代码创建了一个名为 f() 的命名函数表达式,然后将它赋值给变量 factorial。即便把函数赋值给了另一个变量,函数的名字 f 仍然有效,所以递归调用依然能正确完成。

标签: #js递归的应用场景