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 相关文章推荐
关于document.cookie的使用javascript
Apr 11 Javascript
JavaScript中this的使用详解
Nov 08 Javascript
jQuery 获取浏览器所在的IP地址的小例子
Nov 08 Javascript
JS不间断向上滚动效果代码
Dec 25 Javascript
巧用replace将文字表情替换为图片
Apr 17 Javascript
JQuery记住用户名密码实现下次自动登录功能
Apr 27 Javascript
Vue框架之goods组件开发详解
Jan 25 Javascript
JavaScript中var、let、const区别浅析
Jun 24 Javascript
微信小程序冒泡事件及其阻止方法实例分析
Dec 06 Javascript
30分钟精通React今年最劲爆的新特性——React Hooks
Mar 11 Javascript
javascript设计模式 ? 外观模式原理与用法实例分析
Apr 15 Javascript
JS 逻辑判断不要只知道用 if-else 和 switch条件判断(小技巧)
May 27 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
做一个有下拉功能的留言版
2006/10/09 PHP
PHP批量生成静态HTML的简单原理和方法
2014/04/20 PHP
php实现检查文章是否被百度收录
2015/01/27 PHP
Windows2003下php5.4安装配置教程(Apache2.4)
2016/06/30 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
理解Javascript_09_Function与Object
2010/10/16 Javascript
jquery固定底网站底部菜单效果
2013/08/13 Javascript
ExtJS4中使用mixins实现多继承示例
2013/12/03 Javascript
Node.js模块加载详解
2014/08/16 Javascript
jQuery的观察者模式详解
2014/12/22 Javascript
JavaScript访问字符串中单个字符的两种方法
2015/07/03 Javascript
深入理解jQuery中的事件冒泡
2016/05/24 Javascript
JavaScript的兼容性与调试技巧
2016/11/22 Javascript
JavaScript获取短信验证码(周期性)
2016/12/29 Javascript
jQuery按需加载轮播图(web前端性能优化)
2017/02/17 Javascript
Node.js使用orm2进行update操作时关联字段无法修改的解决方法
2017/06/13 Javascript
jQuery实现菜单栏导航效果
2017/08/15 jQuery
vue props传值失败 输出undefined的解决方法
2018/09/11 Javascript
JS使用对象的defineProperty进行变量监控操作示例
2019/02/02 Javascript
这应该是最详细的响应式系统讲解了
2019/07/22 Javascript
js实现点击图片在屏幕中间弹出放大效果
2019/09/11 Javascript
webpack的 rquire.context用法实现工程自动化的方法
2020/02/07 Javascript
Python脚本简单实现打开默认浏览器登录人人和打开QQ的方法
2016/04/12 Python
Python的iOS自动化打包实例代码
2018/11/22 Python
Python实现的拉格朗日插值法示例
2019/01/08 Python
Python实现简易过滤删除数字的方法小结
2019/01/09 Python
PyQt5+Caffe+Opencv搭建人脸识别登录界面
2019/08/28 Python
Python使用内置函数setattr设置对象的属性值
2020/10/16 Python
html5 桌面提醒:Notifycations应用介绍
2012/11/27 HTML / CSS
HTML5+WebSocket实现多文件同时上传的实例
2016/12/29 HTML / CSS
软环境建设心得体会
2014/09/09 职场文书
初中生300字旷课检讨书
2014/11/19 职场文书
宿舍卫生管理制度
2015/08/05 职场文书
大学迎新生欢迎词
2015/09/29 职场文书
python urllib库的使用详解
2021/04/13 Python
JavaScript继承的三种方法实例
2021/05/12 Javascript