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 相关文章推荐
Javascript中的Split使用方法与技巧
Mar 09 Javascript
跨浏览器通用、可重用的选项卡tab切换js代码
Sep 20 Javascript
js实现iframe跨页面调用函数的方法
Dec 13 Javascript
jquery使用slideDown实现模块缓慢拉出效果的方法
Mar 27 Javascript
js中for in语句的用法讲解
Apr 24 Javascript
JQueryEasyUI框架下的combobox的取值和绑定的方法
Jan 22 Javascript
Django+Vue.js搭建前后端分离项目的示例
Aug 07 Javascript
微信小程序实现分享到朋友圈功能
Jul 19 Javascript
在vue中使用G2图表的示例代码
Mar 19 Javascript
使用Mock.js生成前端测试数据
Dec 13 Javascript
浅谈Web Storage API的使用
Jun 23 Javascript
el-table-column 内容不自动换行的解决方法
Aug 14 Vue.js
详解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
比较discuz和ecshop的截取字符串函数php版
2012/09/03 PHP
探讨PHP中OO之静态关键字以及类常量的详解
2013/06/07 PHP
php轻松实现文件上传功能
2016/03/03 PHP
Django中的cookie与session操作实例代码
2017/08/17 PHP
PHP批斗大会之缺失的异常详解
2019/07/09 PHP
JavaScript 设计模式学习 Factory
2009/07/29 Javascript
Javascript 圆角div的实现代码
2009/10/15 Javascript
JavaScript实现的一个倒计时的类
2015/03/12 Javascript
JavaScript的RequireJS库入门指南
2015/07/01 Javascript
Javascript的表单验证长度
2016/03/16 Javascript
Bootstrap组件系列之福利篇几款好用的组件(推荐二)
2016/07/12 Javascript
BootStrap Typeahead自动补全插件实例代码
2016/08/10 Javascript
详解Vue-基本标签和自定义控件
2017/03/24 Javascript
jQuery遍历节点方法汇总(推荐)
2017/05/13 jQuery
详解Vue如何支持JSX语法
2017/11/10 Javascript
利用原生js实现html5小游戏之打砖块(附源码)
2018/01/03 Javascript
Angular使用ControlValueAccessor创建自定义表单控件
2019/03/08 Javascript
js前端面试之同步与异步问题详解
2019/04/03 Javascript
layer插件实现在弹出层中弹出一警告提示并关闭弹出层的方法
2019/09/24 Javascript
如何在Node和浏览器控制台中打印彩色文字
2020/01/09 Javascript
使用vue构建多页面应用的示例
2020/10/22 Javascript
[49:42]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第一局
2016/03/04 DOTA
Linux下使用python自动修改本机网关代码分享
2015/05/21 Python
Python网络编程 Python套接字编程
2017/09/13 Python
Python全排列操作实例分析
2018/07/24 Python
python实现随机漫步算法
2018/08/27 Python
python中cPickle类使用方法详解
2018/08/27 Python
Python SQLAlchemy入门教程(基本用法)
2019/11/11 Python
Python flask框架端口失效解决方案
2020/06/04 Python
pandas DataFrame运算的实现
2020/06/14 Python
德国孕妇装和婴童服装网上商店:bellybutton
2018/04/12 全球购物
New Balance俄罗斯官方网上商店:购买运动鞋
2020/03/02 全球购物
小学教师师德反思
2014/02/03 职场文书
文化大革命观后感
2015/06/17 职场文书
安全责任协议书范本
2016/03/23 职场文书
提高系统的吞吐量解决数据库重复写入问题
2022/04/23 MySQL