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 相关文章推荐
Jquery Ajax.ashx 高效分页实现代码
Oct 20 Javascript
基于mootools插件实现遮罩层新手引导
May 24 Javascript
jQuery scroll事件实现监控滚动条分页示例
Apr 04 Javascript
JS实现超过长度限制后自动跳转下一款文本框的方法
Feb 23 Javascript
深入探讨javascript中的数据类型
Mar 04 Javascript
JQuery创建DOM节点的方法
Jun 11 Javascript
JavaScript对Json的增删改属性详解
Jun 02 Javascript
vue watch监听对象及对应值的变化详解
Feb 24 Javascript
实用的Vue开发技巧
May 30 Javascript
mock.js模拟数据实现前后端分离
Jul 24 Javascript
解决vue.js提交数组时出现数组下标的问题
Nov 05 Javascript
Object.keys() 和 Object.getOwnPropertyNames() 的区别详解
May 21 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字符串函数的总结分析
2013/06/05 PHP
PHP获取昨天、今天及明天日期的方法
2016/02/03 PHP
PHP实现唤起微信支付功能
2019/02/18 PHP
JavaScript词法作用域与调用对象深入理解
2012/11/29 Javascript
js showModalDialog参数的使用详解
2014/01/07 Javascript
confirm的用法示例用于按钮操作时确定是否执行
2014/06/19 Javascript
yepnope.js使用详解及示例分享
2014/06/23 Javascript
DOM基础教程之使用DOM设置文本框
2015/01/20 Javascript
jquery实现无限分级横向导航菜单的方法
2015/03/12 Javascript
js+canvas绘制矩形的方法
2016/01/28 Javascript
jQuery实现的简单百分比进度条效果示例
2016/08/01 Javascript
Js自动截取字符串长度,添加省略号(……)的实现方法
2017/03/06 Javascript
详解vue中computed 和 watch的异同
2017/06/30 Javascript
浅谈Vue父子组件和非父子组件传值问题
2017/08/22 Javascript
jQuery ajax读取本地json文件的实例
2017/10/31 jQuery
webpack4+express+mongodb+vue实现增删改查的示例
2018/11/08 Javascript
使用ThinkJs搭建微信中控服务的实现方法
2019/08/08 Javascript
js实现图片上传到服务器和回显
2020/01/19 Javascript
js实现简单的随机点名器
2020/09/17 Javascript
[04:03]辉夜杯主赛事 12月25日RECAP精彩回顾
2015/12/26 DOTA
[48:51]完美世界DOTA2联赛PWL S2 Magma vs InkIce 第一场 11.28
2020/12/02 DOTA
使用Python求解最大公约数的实现方法
2015/08/20 Python
快速入手Python字符编码
2016/08/03 Python
Python语言实现百度语音识别API的使用实例
2017/12/13 Python
python 删除字符串中连续多个空格并保留一个的方法
2018/12/22 Python
python对csv文件追加写入列的方法
2019/08/01 Python
创建卫生先进单位实施方案
2014/03/10 职场文书
秋季开学典礼主持词
2014/03/19 职场文书
工作经常出错的检讨书
2014/09/13 职场文书
售票员岗位职责
2015/02/15 职场文书
2015新生加入学生会自荐书
2015/03/24 职场文书
校长一岗双责责任书
2015/05/09 职场文书
2015年财政局工作总结
2015/05/21 职场文书
2015年小学辅导员工作总结
2015/05/27 职场文书
仓库管理制度范本
2015/08/04 职场文书
2016婚礼主持词开场白
2015/11/24 职场文书