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 相关文章推荐
JavaScript作用域与作用域链深入解析
Dec 06 Javascript
使用cluster 将自己的Node服务器扩展为多线程服务器
Nov 10 Javascript
javascript实现输出指定行数正方形图案的方法
Aug 03 Javascript
JS实现可拖曳、可关闭的弹窗效果
Sep 26 Javascript
AngularJS过滤器filter用法总结
Dec 13 Javascript
Vuex之理解Getters的用法实例
Apr 19 Javascript
Vue中使用webpack别名的方法实例详解
Jun 19 Javascript
webpack4之如何编写loader的方法步骤
Jun 06 Javascript
如何在微信小程序中实现Mixins方案
Jun 20 Javascript
JS实现页面跳转与刷新的方法汇总
Aug 30 Javascript
JS实现的碰撞检测与周期移动完整示例
Sep 02 Javascript
vue判断按钮是否可以点击
Apr 09 Vue.js
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
其他功能
2006/10/09 PHP
Laravel 4 初级教程之Pages、表单验证
2014/10/30 PHP
PHP微信红包生成代码分享
2016/10/06 PHP
解决php 处理 form 表单提交多个 name 属性值相同的 input 标签问题
2017/05/11 PHP
详解php curl带有csrf-token验证模拟提交方法
2018/04/18 PHP
laravel框架的安装与路由实例分析
2019/10/11 PHP
在js中使用&quot;with&quot;语句中跨frame的变量引用问题
2007/03/08 Javascript
js控制CSS样式属性语法对照表
2012/12/11 Javascript
javascript自适应宽度的瀑布流实现思路
2013/02/20 Javascript
jQuery支持添加事件的日历特效代码分享(3种样式)
2015/08/24 Javascript
Vue如何实现组件的源码解析
2017/06/08 Javascript
Vue.js常用指令之循环使用v-for指令教程
2017/06/27 Javascript
浅谈vue的几种绑定变量的值 防止其改变的方法
2018/03/01 Javascript
轻量级JS Cookie插件js-cookie的使用方法
2018/03/22 Javascript
Vue 中使用富文本编译器wangEditor3的方法
2019/09/26 Javascript
浅析webpack-bundle-analyzer在vue-cli3中的使用
2019/10/23 Javascript
js实现简单五子棋游戏
2020/05/28 Javascript
JavaScript冒泡算法原理与实现方法深入理解
2020/06/04 Javascript
在vue中使用Echarts利用watch做动态数据渲染操作
2020/07/20 Javascript
vuex刷新后数据丢失的解决方法
2020/10/18 Javascript
详解vue修改elementUI的分页组件视图没更新问题
2020/11/13 Javascript
[40:19]2018完美盛典CS.GO表演赛
2018/12/17 DOTA
九步学会Python装饰器
2015/05/09 Python
Python实现定期检查源目录与备份目录的差异并进行备份功能示例
2019/02/27 Python
python实现各种插值法(数值分析)
2019/07/30 Python
Python 实例方法、类方法、静态方法的区别与作用
2019/08/14 Python
利用python+ffmpeg合并B站视频及格式转换的实例代码
2020/11/24 Python
HTML5 window/iframe跨域传递消息 API介绍
2013/08/26 HTML / CSS
html5教你做炫酷的碎片式图片切换 (canvas)
2017/07/28 HTML / CSS
缓刑人员的思想汇报
2014/01/11 职场文书
考试作弊检讨书大全
2014/02/18 职场文书
工厂门卫的岗位职责
2014/07/27 职场文书
婚礼领导致辞大全
2015/07/28 职场文书
公司财务管理制度
2015/08/04 职场文书
初一数学教学反思
2016/02/17 职场文书
SpringBoot读取Resource下文件的4种方法
2021/07/02 Java/Android