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实现tab标签浏览效果
Feb 20 Javascript
js实现右下角提示框的方法
Feb 03 Javascript
js实现使用鼠标拖拽切换图片的方法
May 04 Javascript
jQuery实现美观的多级动画效果菜单代码
Sep 06 Javascript
js显示当前日期时间和星期几
Oct 22 Javascript
学习使用AngularJS文件上传控件
Feb 16 Javascript
原生js实现addClass,removeClass,hasClass方法
Apr 27 Javascript
JS for循环中i++ 和 ++i的区别介绍
Jul 20 Javascript
基于angularjs实现图片放大镜效果
Aug 31 Javascript
再谈javascript常见错误及解决方法
Sep 16 Javascript
基于JS实现横线提示输入验证码随验证码输入消失(js验证码的实现)
Oct 27 Javascript
JavaScript继承定义与用法实践分析
May 28 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
MySQL修改密码方法总结
2008/03/25 PHP
10个可以简化php开发过程的MySQL工具
2010/04/11 PHP
PHP 关于访问控制的和运算符优先级介绍
2013/07/08 PHP
PHP中soap的用法实例
2014/10/24 PHP
使用PHP和JavaScript判断请求是否来自微信内浏览器
2015/08/18 PHP
php精度计算的问题解析
2019/06/21 PHP
Javascript创建自定义对象 创建Object实例添加属性和方法
2012/06/04 Javascript
js点击页面其它地方将某个显示的DIV隐藏
2012/07/12 Javascript
jQuery .attr()和.removeAttr()方法操作元素属性示例
2013/07/16 Javascript
JavaScript异步加载浅析
2014/12/28 Javascript
js实现不提交表单获取单选按钮值的方法
2015/08/21 Javascript
js实现ctrl+v粘贴上传图片(兼容chrome、firefox、ie11)
2016/03/09 Javascript
JavaScript+Java实现HTML页面转为PDF文件保存的方法
2016/05/30 Javascript
Js操作DOM元素及获取浏览器高宽的简单方法
2016/09/08 Javascript
JS添加或修改控件的样式(Class)实现方法
2016/10/15 Javascript
jQuery实现滚动条滚动到子元素位置(方便定位)
2017/01/08 Javascript
jQuery简单获取DIV和A标签元素位置的方法
2017/02/07 Javascript
bootstrap table 多选框分页保留示例代码
2017/03/08 Javascript
vue-router的两种模式的区别
2019/05/30 Javascript
vue 组件中使用 transition 和 transition-group实现过渡动画
2019/07/09 Javascript
Jquery+AJAX实现无刷新上传并重命名文件操作示例【PHP后台接收】
2020/05/29 jQuery
在Django中进行用户注册和邮箱验证的方法
2016/05/09 Python
python数据类型_字符串常用操作(详解)
2017/05/30 Python
Python Flask框架模板操作实例分析
2019/05/03 Python
简单了解Python3 bytes和str类型的区别和联系
2019/12/19 Python
Pandas将列表(List)转换为数据框(Dataframe)
2020/04/24 Python
Python如何根据时间序列数据作图
2020/05/12 Python
解决HTML5中的audio在手机端和微信端的不能自动播放问题
2019/11/04 HTML / CSS
Maisons du Monde德国:法国家具和装饰的市场领导者
2019/07/26 全球购物
医学生实习自我鉴定
2013/09/27 职场文书
经济系大学生求职信
2013/10/01 职场文书
学习十八届四中全会依法治国心得体会
2014/11/03 职场文书
优秀党员申报材料
2014/12/18 职场文书
党员证明模板
2015/06/19 职场文书
Python time库的时间时钟处理
2021/05/02 Python
vue打包时去掉所有的console.log
2022/04/10 Vue.js