Javascript 实现匿名递归的实例代码

 更新时间:2017年05月25日 09:55:55   作者:肖国栋  
本篇文章主要介绍了Javascript 实现匿名递归的实例代码,利用 arguments.callee 来实现匿名递归的方式。有兴趣的可以了解一下

递归是一种常见的编程技巧,实名递归相信大家都不陌生,但如果想要实现匿名递归呢?比如想要返回一个匿名递归函数,又或者是定义一个匿名递归函数并直接调用它,该怎样去做呢?本文将来探讨一下它的实现。

实名递归

我们还是先从实名递归说起吧,还是用那个最简单的求阶乘的例子:

function fact(n) {
 if (n < 2) {
  return n;
 } else {
  return n * fact(n - 1);
 }
}
console.log(fact(5));

递归要求自己调用自己,如果函数有名字,这就太简单不过了。

利用变量实现递归

函数还可以赋给一个变量,不过要实现递归,函数体里面还是要依赖这个变量名:

var f = function(n) {
 if (n < 2) {
  return n;
 } else {
  return n * f(n - 1);
 }
}
console.log(f(5));

应该说这种方式跟之前的其实没有本质的不同。

匿名递归

现在我们来探讨匿名递归的实现。

初步设想

如果想要返回一个匿名递归函数,又或者是定义一个匿名递归函数并直接调用它:

(function (n) {
 if (n < 2) {
  return n;
 } else {
  return n * ?(n - 1);
 }
})(5);

如果没有一个名字,代码中那个问号我们就不知道要填写什么,就没法形成递归了,此时我们要怎么办呢?这时就要请出 arguments 对象了。

arguments 对象

在 javascript 的函数中,arguments 对象代表了实际调用时的参数对象。在我们的递归函数中,实际上我们也可以完全不用去定义“形式参数” n:

function factNoParam() {
 if (arguments[0] < 2) {
  return arguments[0];
 } else {
  return arguments[0] * factNoParam(arguments[0] - 1);
 }
}
console.log(factNoParam(5));

只要我们在调用时传入了实际的参数,就可以用 arguments[0] 取得实际传入的这个参数的值。

如果有更多的参数,还可以 arguments[1],arguments[2] 等来取得。

arguments.callee 属性

arguments 可以用来获取参数,相信你可能已经知道了,但 arguments 对象其实还有一个属性,即所谓的 callee。arguments.callee 代表了这个函数本身。这是什么意思呢?其实我们完全可以把 fact 写成这样:

function fact(n) {
 if (n < 2) {
  return n;
 } else {
  return n * arguments.callee(n - 1);
 }
}
console.log(fact(5));

那么它依然是递归的。因为 arguments.callee 实际就等于 fact。

那么,到了这里,有了这个属性的帮助,要实现匿名递归就不难了,只要把 ? 改为 arguments.callee 即可:

(function (n) {
 if (n < 2) {
  return n;
 } else {
  return n * arguments.callee(n - 1);
 }
})(5);

如果有需要,也可以把它作为匿名递归返回。

关于 javascript 实现匿名递归的介绍就到这里。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 控制打印时页眉角的代码

    控制打印时页眉角的代码

    控制打印时页眉角的代码...
    2007-02-02
  • JavaScript 里的类数组对象

    JavaScript 里的类数组对象

    这篇文章主要介绍了JavaScript 里的类数组对象的相关资料,需要的朋友可以参考下
    2015-04-04
  • JavaScript架构前端不能没有监控系统原因

    JavaScript架构前端不能没有监控系统原因

    这篇文章主要为大家介绍了为什么前端不能没有监控系统的原因,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • javascript实现动态CSS换肤技术的脚本

    javascript实现动态CSS换肤技术的脚本

    javascript实现动态CSS换肤技术的脚本...
    2007-06-06
  • Three光源Target位置改变光照方向不变的问题解决方法

    Three光源Target位置改变光照方向不变的问题解决方法

    这篇文章主要为大家介绍了Three光源Target位置改变光照方向不变的问题及解决方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • 用js实现猜数字小游戏

    用js实现猜数字小游戏

    这篇文章主要为大家详细介绍了用js实现猜数字小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • 微信小程序如何调用json数据接口并解析

    微信小程序如何调用json数据接口并解析

    这篇文章主要介绍了微信小程序如何调用json数据接口并解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-06-06
  • 关于原生js中bind函数的简单实现

    关于原生js中bind函数的简单实现

    下面小编就为大家带来一篇关于原生js中bind函数的简单实现。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • JavaScript中的二进制数据处理方法详解

    JavaScript中的二进制数据处理方法详解

    Blob、ArrayBuffer和Buffer是JavaScript中用于表示和操作二进制数据的三种主要方式,本文将深入探讨这些概念,以及它们如何在JavaScript中使用,需要的可以参考一下
    2023-06-06
  • 分享JavaScript监听全部Ajax请求事件的方法

    分享JavaScript监听全部Ajax请求事件的方法

    最近在做一个小项目,引入了第三方js文件,这个文件会调用XMLHttpRequest向服务器发送 Ajax请求,但是我有需要监听其Ajax请求的某些事件,以便额外地执行其他脚本。于是稍微看了看监听 Ajax请求的事件方法,在这里分享给大家。有需要的朋友们可以参考借鉴。
    2016-08-08

最新评论