JavaScript递归函数定义与用法实例分析


Posted in Javascript onJanuary 24, 2019

本文实例讲述了JavaScript递归函数定义与用法。分享给大家供大家参考,具体如下:

递归函数是一个函数通过名字调用自身的情况下形成的,比如经典的递归阶乘函数:

function factorial(num) {
  if (num <= 1) {
    return 1;
  } else {
    return num * factorial(num - 1);
  }
}

上面的这种写法,可能会造成问题:

var anotherFactorial = factorial;
factorial = null;
console.log(anotherFactorial(4));//出错

因为 factorial 函数定义内部使用了自身的函数名,所以当 factorial 被置为 null 后,factorial 已不是函数,自然报错啦 O(∩_∩)O~。

可以使用 arguments.callee 指向正在执行的函数的指针来避免上面出现的问题:

function factorial(num) {
  if (num <= 1) {
    return 1;
  } else {
    return num * arguments.callee(num - 1);
  }
}
var anotherFactorial = factorial;
factorial = null;
console.log(anotherFactorial(4));

运行结果:24

但在严格模式下,不能访问 arguments.callee,但可以使用命名函数表达式来实现上述功能:

var factorial = (
    function f(num) {
      if (num <= 1) {
        return 1;
      } else {
        return num * f(num - 1);
      }
    }
);
var anotherFactorial = factorial;
factorial = null;
console.log(anotherFactorial(4));

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
document.all与WEB标准
May 13 Javascript
JS+CSS实现简易实用的滑动门菜单效果
Sep 18 Javascript
如何根据百度地图计算出两地之间的驾驶距离(两种语言js和C#)
Oct 29 Javascript
IE6-IE9使用JSON、table.innerHTML所引发的问题
Dec 22 Javascript
学习Angularjs分页指令
Jul 01 Javascript
js发送短信倒计时的简单实现方法
Sep 08 Javascript
jQuery实现select模糊查询(反射机制)
Jan 14 Javascript
原生JS+HTML5实现跟随鼠标一起流动的粒子动画效果
May 03 Javascript
vue代码分割的实现(codesplit)
Nov 13 Javascript
Makefile/cmake/node-gyp中区分判断不同平台的方法
Dec 18 Javascript
jQuery实现获取当前鼠标位置并输出功能示例
Jan 05 jQuery
JS中使用react-tooltip插件实现鼠标悬浮显示框
May 15 Javascript
jQuery实现当拉动滚动条到底部加载数据的方法分析
Jan 24 #jQuery
vue结合element-ui使用示例
Jan 24 #Javascript
VUE+Element环境搭建与安装的方法步骤
Jan 24 #Javascript
JS实现带阴历的日历功能详解
Jan 24 #Javascript
微信小程序webview实现长按点击识别二维码功能示例
Jan 24 #Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变rgba的a值实现)
Jan 24 #Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变opacity实现)
Jan 24 #Javascript
You might like
PHP中的类型约束介绍
2015/05/11 PHP
微信公众号OAuth2.0网页授权问题浅析
2017/01/21 PHP
PHP单例模式应用示例【多次连接数据库只实例化一次】
2018/12/18 PHP
javascript 系统文件夹文件操作及参数介绍
2013/01/08 Javascript
自己写了一个展开和收起的多更能型的js效果
2013/03/05 Javascript
nodejs简单实现中英文翻译
2015/05/04 NodeJs
jQuery的bind()方法使用详解
2015/07/15 Javascript
JavaScript学习笔记整理之引用类型
2016/01/22 Javascript
JS绘制微信小程序画布时钟
2016/12/24 Javascript
两种简单的跨域方法(jsonp、php)
2017/01/02 Javascript
vue axios同步请求解决方案
2017/09/29 Javascript
React 使用browserHistory项目访问404问题解决
2018/06/01 Javascript
在Vue中使用axios请求拦截的实现方法
2018/10/25 Javascript
vue中的适配px2rem示例代码
2018/11/19 Javascript
Vue 自定义标签的src属性不能使用相对路径的解决
2019/09/17 Javascript
使用webpack和rollup打包组件库的方法
2021/02/25 Javascript
[52:15]2014 DOTA2国际邀请赛中国区预选赛5.21 HGT VS LGD-GAMING
2014/05/23 DOTA
[03:58]2014DOTA2国际邀请赛 龙宝赛后解密DK获胜之道
2014/07/14 DOTA
[01:05:36]VP vs TNC Supermajor小组赛B组 BO3 第二场 6.2
2018/06/03 DOTA
Python中交换两个元素的实现方法
2018/06/29 Python
浅谈python下tiff图像的读取和保存方法
2018/12/04 Python
opencv实现静态手势识别 opencv实现剪刀石头布游戏
2019/01/22 Python
关于python3中setup.py小概念解析
2019/08/22 Python
基于Python新建用户并产生随机密码过程解析
2019/10/08 Python
python脚本实现音频m4a格式转成MP3格式的实例代码
2019/10/09 Python
Matplotlib中%matplotlib inline如何使用
2020/07/28 Python
Foot Locker英国官网:美国知名运动产品零售商
2019/02/21 全球购物
英语专业学生个人求职信范文
2014/01/06 职场文书
开办大学饮食联盟创业计划书
2014/01/29 职场文书
户籍证明模板
2014/09/28 职场文书
十八大标语口号
2014/10/09 职场文书
2014年教育培训工作总结
2014/12/08 职场文书
如何将numpy二维数组中的np.nan值替换为指定的值
2021/05/14 Python
小程序实现筛子抽奖
2021/05/26 Javascript
springboot 自定义配置 解决Boolean属性不生效
2022/03/18 Java/Android
Java实现注册登录跳转
2022/06/16 Java/Android