作家
登录

js中递归函数的使用介绍

作者: 来源:www.28hudong.com 2013-03-30 00:21:28 阅读 我要评论

下面我们就做一个10以内的阶乘试试看吧: js中递归函数的使用 [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行] 递归函数的调用就说这么多了 js递归函数调用自身时的保险方式。 来自js高级程序设计 一个典型阶乘递归函数: 复制代码 代码如下: function fact(num){ if (num<=1){ return 1; }else{ return num*fact(num-1); } } 以下代码可导致出错: var anotherFact = fact; fact = null; alert(antherFact(4)); //出错 由于fact已经不是函数了,所以出错。 用arguments.callee可解决问题,这是一个指向正在执行的函数的指针。 新的函数为: 复制代码 代码如下: function fact(num){ if (num<=1){ return 1; }else{ return num*arguments.callee(num-1); //此处更改了。 } } var anotherFact = fact; fact = null; alert(antherFact(4)); //结果为24. JS普通递归的改进 递归函数是在一个函数通过名字调用自身的情况下构成的,如下所示: 复制代码 代码如下: function factorial(num) { if(num<=1) { return 1; } else { return num * factorial(num-1); } } 这是一个经典的阶乘函数。表面看来没有什么问题,但下面的代码却可能导致它出错。 var anotherFactorial = factorial; anotherFactorial(4); //输出 24 factorial = null; anotherFactorial (4); //TypeError: Property 'factorial' of object [object Window] is not a function chrome 下测试 原因在于,我们定义的函数名,其实是指向函数的一个指针,此时定义了anotherFactorial 也指向了那个函数,所以调用anotherFactorial (4)可以成功的输出24 此时 factorial = null; 那么执行定义函数的引用就剩下了anotherFactorial,那么在调用anotherFactorial(4)就会显示以上的错误的信息。 此时可以使用arguments.callee来替代函数定义中的 factorial, 函数的定义就变成了: 复制代码 代码如下: function factorial(num) { if(num<=1) { return 1; } else { return num * arguments.callee(num-1); } } 那么在使用上面的4行测试代码,最后一行测试代码也可以成功的输出24. -------------------------------------- 上述的内容摘自<<JavaScript高级程序设计>>第2版 144页 7.1节

  推荐阅读

  JS正则中的RegExp对象对象

有两种方式可以创建RegExp对象的实例。 使用RegExp的显式构造函数,语法为:new RegExp("pattern"[,"flags"])。 使用RegExp的隐式构造函数,采用纯文本格式:/pattern/[flags]。 pattern部分为要使用的正则表达式模>>>详细阅读


本文标题:js中递归函数的使用介绍

地址:http://www.17bianji.com/kaifa2/JS/22997.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)