JavaScript 之递归问题的解决

递归:

递归函数在定义的时候需要调用自己,因此会用到自己的函数名;但是在js中会出现如下的问题:
<pre>
function factorial(num) {
if (num <= 1)
return 1;
else
return num * factorial(num - 1);
}
var anotherFactorial = factorial;
factorial = null;
anotherFactorial(6);
//由于迭代过程中需要用到factorial,但该值已被赋值为空,所以会出错
</pre>

解决方法:有两种方式可以解决该问题
1.使用 arguments.callee:
该参数指向一个正在执行的函数的指针,因此可以用它来实现函数对自身的递归调用。
<pre>
function factorial(num) {
if (num <= 1)
return 1;
else
return num * arguments.callee(num - 1);
}
var anotherFactorial = factorial;
factorial = null;
alert(anotherFactorial(6));
</pre>
这种写法之下,即便factorial被赋值为空,依然可以引用自身来实现递归。
2.使用命名函数表达式
但是在严格模式之下,不可以访问arguments.callee属性,因此可以使用命名函数表达式:
<pre>
eg:var factorial = (function f(num) {
if (num <= 1)
return 1;
else
return num * f(num - 1);});
</pre>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,267评论 0 4
  • 本文档内容参考 《JavaScript 闯关记》之函数 函数是一段代码,它只定义一次,但可以被执行或调用任意次。在...
    穿越人海遇见你阅读 1,011评论 0 1
  • 定义函数的方式有两种:函数声明和函数表达式。 函数声明的一个重要特征就是函数声明提升,意思是在执行代码前会先读取函...
    oWSQo阅读 678评论 0 0
  • 原文地址:C语言函数调用栈(一)C语言函数调用栈(二) 0 引言 程序的执行过程可看作连续的函数调用。当一个函数执...
    小猪啊呜阅读 4,665评论 1 19
  • 每当你看见细细的雨,你会想到什么呢?而我没当看见细细的雨,总把他幻想成一条条的线,这一条条的线就是大自然给你的...
    影子落英阅读 313评论 0 0