JavaScript中递归实现的方法及其区别


Posted in Javascript onSeptember 12, 2017

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

递归实现阶乘函数:

方法一:通过使用函数的名字

function factorial(num){
    if(num<=1){
      return 1;
    }else{
      return num*factorial(num-1);
    }
  }
  console.log(factorial(4));

结果为:24;

但是这种方法实现递归有一个问题,观察以下代码:

function factorial(num){
    if(num<=1){
      return 1;
    }else{
      return num*factorial(num-1);
    }
  }
  var anthorFactorial=factorial;
  console.log(anthorFactorial(4));

结果为:24;

但是:

function factorial(num){
    if(num<=1){
      return 1;
    }else{
      return num*factorial(num-1);
    }
  }
  var anthorFactorial=factorial;
  factorial=null;
  console.log(anthorFactorial(4));

结果为:报错

这是因为:

我们定义的函数名,其实是指向函数的一个指针,定义的anotherFactorial 也指向了那个函数,所以调用anotherFactorial (4)可以成功的输出24

当 factorial = null时,执行定义函数的引用就剩下了anotherFactorial,那么在调用anotherFactorial(4)就会显示以上的错误的信息。

此时可以使用arguments.callee来替代函数定义中的 factorial。

方法二:通过使用arguments.callee

function factorial(num){
    if(num<=1){
      return 1;
    }else{
      return num*arguments.callee(num-1);
    }
  }
  var anthorFactorial=factorial;
  factorial=null;
  console.log(anthorFactorial(4));

结果为:24

arguments.callee是一个指向正在执行的函数的指针,因此可以用arguments.callee来实现对函数的递归调用。通过使用arguments.callee来代替函数名,可以保证在调用函数时无论怎样都不会出现问题。因此,在编写递归函数时,使用argumnts.callee总比使用函数名更加保险。
但是,在严格模式下,不能通过脚本访问arguments.callee,访问这个属性会报错,不过可以通过命名函数表达式来达到相同的效果。

方法三:通过命名函数表达式

var factorial=function f(num){
    if(num<=1){
      return 1;
    }else{
      return num*f(num-1);
    }
  };
  f=null;
  console.log(factorial(4));

这种方式在严格和非严格模式下都有效。

总结

以上所述是小编给大家介绍的JavaScript中递归实现的方法及其区别,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
基于jquery的一个图片hover的插件
Apr 24 Javascript
使用jQuery fancybox插件打造一个实用的数据传输模态弹出窗体
Jan 15 Javascript
JavaScript组件开发完整示例
Dec 15 Javascript
Bootstrop实现多级下拉菜单功能
Nov 24 Javascript
jQuery实现立体式数字动态增加(animate方法)
Dec 21 Javascript
完美的js图片轮换效果
Feb 05 Javascript
微信小程序的日期选择器的实例详解
Sep 29 Javascript
angular中ui calendar的一些使用心得(推荐)
Nov 03 Javascript
Vue父子传递实例讲解
Feb 14 Javascript
使用Mock.js生成前端测试数据
Dec 13 Javascript
jQuery实现动态向上滚动
Dec 21 jQuery
javascript之Object.assign()的痛点分析
Mar 03 Javascript
详解react-native-fs插件的使用以及遇到的坑
Sep 12 #Javascript
React中jquery引用的实现方法
Sep 12 #jQuery
JS+canvas动态绘制饼图的方法示例
Sep 12 #Javascript
详解react-router4 异步加载路由两种方法
Sep 12 #Javascript
JS+canvas绘制的动态机械表动画效果
Sep 12 #Javascript
BootStrap Table实现server分页序号连续显示功能(当前页从上一页的结束序号开始)
Sep 12 #Javascript
Angular 4.0学习教程之架构详解
Sep 12 #Javascript
You might like
PHP 危险函数解释 分析
2009/04/22 PHP
理解php原理的opcodes(操作码)
2010/10/26 PHP
PHP导出EXCEL快速开发指南--PHPEXCEL的使用详解
2013/06/03 PHP
一致性哈希算法以及其PHP实现详细解析
2013/08/24 PHP
PHP5中实现多态的两种方法实例分享
2014/04/21 PHP
十个PHP高级应用技巧果断收藏
2015/09/25 PHP
PHP获取指定时间段之间的 年,月,天,时,分,秒
2016/06/05 PHP
php flush无效,IIS7下php实时输出的方法
2016/08/25 PHP
javascript操作文本框readOnly
2007/05/15 Javascript
js中if语句的几种优化代码写法
2011/03/12 Javascript
在JavaScript中监听IME键盘输入事件
2011/05/29 Javascript
jQuery.each()用法分享
2012/07/31 Javascript
js导出txt示例代码
2014/01/14 Javascript
javascript中使用正则计算中文长度的例子
2014/04/29 Javascript
jquery判断元素是否隐藏的多种方法
2014/05/06 Javascript
jQuery插件实现控制网页元素动态居中显示
2015/03/24 Javascript
JavaScript获得页面base标签中url的方法
2015/04/03 Javascript
js实现select跳转菜单新窗口效果代码分享(超简单)
2015/08/21 Javascript
学习javascript面向对象 掌握创建对象的9种方式
2016/01/04 Javascript
Jquery基础之事件操作详解
2016/06/14 Javascript
Ajax实现不刷新取最新商品
2017/03/01 Javascript
vue-cli+webpack在生成的项目中使用bootstrap实例代码
2017/05/26 Javascript
解决vue脚手架项目打包后路由视图不显示的问题
2018/09/20 Javascript
小程序自定义日历效果
2018/12/29 Javascript
用原生JS实现爱奇艺首页导航栏代码实例
2019/09/19 Javascript
Element Breadcrumb 面包屑的使用方法
2020/07/26 Javascript
javascript实现扫雷简易版
2020/08/18 Javascript
python opencv实现gif图片分解的示例代码
2019/12/13 Python
在pycharm中debug 实时查看数据操作(交互式)
2020/06/09 Python
Python3交互式shell ipython3安装及使用详解
2020/07/11 Python
复古服装:RetroStage
2019/05/10 全球购物
小学生评语集锦
2014/04/18 职场文书
效能风暴心得体会
2014/09/04 职场文书
大学学生会主席竞选稿怎么写?
2019/08/19 职场文书
Vue 打包后相对路径的引用问题
2022/06/05 Vue.js
一文教你快速生成MySQL数据库关系图
2022/06/28 Redis