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 相关文章推荐
Extjs EditorGridPanel中ComboBox列的显示问题
Jul 04 Javascript
仿新浪微博返回顶部的jquery实现代码
Oct 01 Javascript
js实现的复制兼容chrome和IE
Apr 03 Javascript
实例分析javascript中的call()和apply()方法
Nov 28 Javascript
理解javascript中的原型和原型链
Jul 30 Javascript
利用prop-types第三方库对组件的props中的变量进行类型检测
May 02 Javascript
xmlplus组件设计系列之下拉刷新(PullRefresh)(6)
May 03 Javascript
Node.js五大应用性能技巧小结(必须收藏)
Aug 09 Javascript
JavaScript实现的搜索及高亮显示功能示例
Aug 14 Javascript
详解vue 数据传递的方法
Apr 19 Javascript
vue-router 源码之实现一个简单的 vue-router
Jul 02 Javascript
JS removeAttribute()方法实现删除元素的某个属性
Jan 11 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和Mysqlweb应用开发核心技术-第1部分 Php基础-2 php语言介绍
2011/07/03 PHP
Zend Studio 实用快捷键一览表(精心整理)
2013/08/10 PHP
Extjs Ajax 乱码问题解决方案
2009/04/15 Javascript
Jquey拖拽控件Draggable使用方法(asp.net环境)
2010/09/28 Javascript
js全屏显示显示代码的三种方法
2013/11/11 Javascript
js预加载图片方法汇总
2015/06/15 Javascript
javascript中for/in循环及使用技巧
2015/09/01 Javascript
Bootstrap与KnockoutJs相结合实现分页效果实例详解
2016/05/03 Javascript
使用RequireJS库加载JavaScript模块的实例教程
2016/06/06 Javascript
jQuery弹出下拉列表插件(实现kindeditor的@功能)
2016/08/16 Javascript
webpack入门必知必会
2017/01/16 Javascript
Jquery树插件zTree实现菜单树
2017/01/24 Javascript
xmlplus组件设计系列之按钮(2)
2017/04/26 Javascript
第一次记录Bootstrap table学习笔记(1)
2017/05/18 Javascript
微信小程序三级联动地址选择器的实例代码
2017/07/12 Javascript
nodejs的路径问题的解决
2018/06/30 NodeJs
Vue.js 父子组件通信的十种方式
2018/10/30 Javascript
Element Alert警告的具体使用方法
2020/07/27 Javascript
Vue解决echart在element的tab切换时显示不正确问题
2020/08/03 Javascript
利用vue3+ts实现管理后台(增删改查)
2020/10/30 Javascript
Python判断文件或文件夹是否存在的三种方法
2017/07/27 Python
Anaconda 离线安装 python 包的操作方法
2018/06/11 Python
使用Python制作自动推送微信消息提醒的备忘录功能
2018/09/06 Python
对python的输出和输出格式详解
2018/12/08 Python
Python+OpenCV实现旋转文本校正方式
2020/01/09 Python
Python3 元组tuple入门基础
2020/02/09 Python
python中sympy库求常微分方程的用法
2020/04/28 Python
Tensorflow使用Anaconda、pycharm安装记录
2020/07/29 Python
分享30个新鲜的CSS3打造的精美绚丽效果(附演示下载)
2012/12/28 HTML / CSS
正规的求职信范文分享
2013/12/11 职场文书
幼儿园庆六一游园活动方案
2014/01/29 职场文书
小学网上祭英烈活动总结
2014/07/05 职场文书
城管个人总结
2015/02/28 职场文书
2016年党校科级干部培训班学习心得体会
2016/01/06 职场文书
《家》读后感:万惜拯救,冷暖自知
2019/09/25 职场文书
SQL实战演练之网上商城数据库商品类别数据操作
2021/10/24 MySQL