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对象和属性的创建方法
Jan 15 Javascript
Jquery中Ajax 缓存带来的影响的解决方法
May 19 Javascript
jquery1.10给新增元素绑定事件的方法
Mar 06 Javascript
JavaScript提升性能的常用技巧总结【经典】
Jun 20 Javascript
使用JS轻松实现ionic调用键盘搜索功能(超实用)
Sep 06 Javascript
JavaScript实现自动切换图片代码
Oct 11 Javascript
Bootstrap栅格系统的使用和理解2
Dec 14 Javascript
vue项目中公用footer组件底部位置的适配问题
May 10 Javascript
详解AngularJS 过滤器的使用
Jun 02 Javascript
jQuery使用each遍历循环的方法
Sep 19 jQuery
vue两组件间值传递 $router.push实现方法
May 15 Javascript
详解Vue 数据更新了但页面没有更新的 7 种情况汇总及延伸总结
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
php urlencode()与urldecode()函数字符编码原理详解
2011/12/06 PHP
深入密码加salt原理的分析
2013/06/06 PHP
PHP编程快速实现数组去重的方法详解
2017/07/22 PHP
PHP递归实现文件夹的复制、删除、查看大小操作示例
2017/08/11 PHP
PHP html_entity_decode()函数讲解
2019/02/25 PHP
实例化php类时传参的方法分析
2020/06/05 PHP
javascript dom 操作详解 js加强
2009/07/13 Javascript
优化 JavaScript 代码的方法小结
2009/07/16 Javascript
javascript实现点击按钮让DIV层弹性移动的方法
2015/02/24 Javascript
javascript实现的淘宝旅行通用日历组件用法实例
2015/08/03 Javascript
基于JS实现简单的样式切换效果代码
2015/09/04 Javascript
Javascript闭包实例详解
2015/11/29 Javascript
浅谈jQuery中的checkbox问题
2016/08/10 Javascript
ES6中Iterator与for..of..遍历用法分析
2017/03/31 Javascript
Vue开发环境中修改端口号的实现方法
2019/08/15 Javascript
用js编写留言板
2020/03/17 Javascript
Python中每次处理一个字符的5种方法
2015/05/21 Python
对numpy中轴与维度的理解
2018/04/18 Python
使用python爬取微博数据打造一颗“心”
2019/06/28 Python
利用Python实现手机短信监控通知的方法
2019/07/22 Python
pytorch模型存储的2种实现方法
2020/02/14 Python
Spring Boot中使用IntelliJ IDEA插件EasyCode一键生成代码详细方法
2020/03/20 Python
python中的split、rsplit、splitlines用法说明
2020/10/23 Python
详解Django中的FBV和CBV对比分析
2021/03/01 Python
html5定位获取当前位置并在百度地图上显示
2014/08/22 HTML / CSS
购买瑞典当代设计的腕表和太阳眼镜:TRIWA
2016/10/30 全球购物
GIVENCHY纪梵希官方旗舰店:高定彩妆与贵族护肤品
2018/04/16 全球购物
英国领先的在线旅游和休闲零售商:lastminute.com
2019/01/23 全球购物
跟单文员的岗位职责
2013/11/14 职场文书
技术经理的自我评价范文
2013/12/03 职场文书
销售业务员岗位职责
2014/01/29 职场文书
解除劳动合同协议书范本
2014/04/14 职场文书
2014年教师业务学习材料
2014/05/12 职场文书
事业单位岗位说明书
2015/10/08 职场文书
Vue全局事件总线你了解吗
2022/02/24 Vue.js
Golang Web 框架Iris安装部署
2022/08/14 Python