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实现的动态添加表单元素input,button等(appendChild)
Nov 24 Javascript
jquery attr方法获取input的checked属性问题
May 26 Javascript
Javascript类型转换的规则实例解析
Feb 23 Javascript
JavaScript计算器网页版实现代码分享
Jul 15 Javascript
JavaScript 对象详细整理总结
Sep 29 Javascript
angular或者js怎么确定选中ul中的哪几个li
Aug 16 Javascript
强大的JavaScript响应式图表Chartist.js的使用
Sep 13 Javascript
JS中的JSON对象的定义和取值实现代码
May 09 Javascript
vue.extend与vue.component的区别和联系
Sep 19 Javascript
js回文数的4种判断方法示例
Jun 04 Javascript
在vue中根据光标的显示与消失实现下拉列表
Sep 29 Javascript
微信小程序实现电子签名功能
Jul 29 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同时支持GIF、png、JPEG
2006/10/09 PHP
一篇不错的PHP基础学习笔记
2007/03/18 PHP
关于PHP session 存储方式的详细介绍
2013/06/25 PHP
PHP将页面中点击数量高的链接进行高亮显示的方法
2016/05/30 PHP
PHP扩展类型及安装方式解析
2020/04/27 PHP
JavaScript四种调用模式和this示例介绍
2014/01/02 Javascript
Jquery Ajax方法传值到action的方法
2014/05/11 Javascript
使用text方法获取Html元素文本信息示例
2014/09/01 Javascript
原生js和jQuery随意改变div属性style的名称和值
2014/10/22 Javascript
了不起的node.js读书笔记之node.js中的特性
2014/12/22 Javascript
老生常谈JavaScript数组的用法
2016/06/10 Javascript
jQuery实现单击按钮遮罩弹出对话框效果(1)
2017/02/20 Javascript
解决百度Echarts图表坐标轴越界的方法
2018/10/17 Javascript
微信小程序全局变量功能与用法详解
2019/01/22 Javascript
Vuex的API文档说明详解
2020/02/05 Javascript
jQuery实时统计输入框字数及限制
2020/06/24 jQuery
[01:06:30]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第二场 1月9日
2021/03/11 DOTA
Python、Javascript中的闭包比较
2015/02/04 Python
python的Crypto模块实现AES加密实例代码
2018/01/22 Python
Python3 log10()函数简单用法
2019/02/19 Python
Python基于Opencv来快速实现人脸识别过程详解(完整版)
2019/07/11 Python
keras中模型训练class_weight,sample_weight区别说明
2020/05/23 Python
Python StringIO及BytesIO包使用方法解析
2020/06/15 Python
Python SMTP配置参数并发送邮件
2020/06/16 Python
Python函数调用追踪实现代码
2020/11/27 Python
Python实现Appium端口检测与释放的实现
2020/12/31 Python
python 指定源路径来解决import问题的操作
2021/03/04 Python
Nike台湾官方商店:Nike.com (TW)
2017/08/16 全球购物
英国女士和男士时尚服装网上购物:Top Labels Online
2018/03/25 全球购物
汽车技术服务英文求职信范文
2014/01/02 职场文书
外贸采购员岗位职责
2014/03/08 职场文书
身边的榜样活动方案
2014/08/20 职场文书
四查四看整改措施
2014/09/19 职场文书
法定授权委托证明书
2015/06/18 职场文书
CSS3实现的3D隧道效果
2021/04/27 HTML / CSS
vue3.0 数字翻牌组件的使用方法详解
2022/04/20 Vue.js