Javascript 实现匿名递归的实例代码
递归是一种常见的编程技巧,实名递归相信大家都不陌生,但如果想要实现匿名递归呢?比如想要返回一个匿名递归函数,又或者是定义一个匿名递归函数并直接调用它,该怎样去做呢?本文将来探讨一下它的实现。
实名递归
我们还是先从实名递归说起吧,还是用那个最简单的求阶乘的例子:
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 实现匿名递归的介绍就到这里。希望对大家的学习有所帮助,也希望大家多多支持我们。
相关推荐
-
java、js中实现无限层级的树形结构方法(类似递归)
js中: var zNodes=[ {id:0,pId:-1,name:"Aaaa"}, {id:1,pId:0,name:"A"}, {id:11,pId:1,name:"A1"}, {id:12,pId:1,name:"A2"}, {id:13,pId:1,name:"A3"}, {id:2,pId:0,name:"B"}, {id:21,pId:2,name:"B1&qu
-
Vue.js 递归组件实现树形菜单(实例分享)
最近看了 Vue.js 的递归组件,实现了一个最基本的树形菜单. 项目结构: main.js 作为入口,很简单: import Vue from 'vue' Vue.config.debug = true import main from './components/main.vue' new Vue({ el: '#app', render: h => h(main) }) 它引入了一个组件 main.vue: <template> <div class="tree-m
-
JS基于递归实现倒计时效果的方法
本文实例讲述了JS基于递归实现倒计时效果的方法.分享给大家供大家参考,具体如下: 效果: 事件: //发送验证码 $('.js-sms-code').click(function(){ $(this).attr("disabled", "disabled").html("<span style='color:#666'><span id='countdown'>60</span>s 后再试</span>&qu
-
javascript实现网页子页面遍历回调的方法(涉及 window.frames、递归函数、函数上下文)
本文实例讲述了javascript实现网页子页面遍历回调的方法(涉及 window.frames.递归函数.函数上下文).分享给大家供大家参考.具体如下: 提炼于本人手写的纯 JavaScript 工具程序,用于遍历当前网页的所有子页面 并执行迭代回调,且回调函数返回值可用于结果回传,有助于减少闭包变量~ 其特点在于 -- 递归遍历时只检索子页面的 Window 对象,不立即执行回调函数,而是在检索结束后在普通循环结构中回调.这样可以尽量减少 递归调用时的内存消耗,也简化了程序结构,易于维护 全
-
一个JavaScript递归实现反转数组字符串的实例
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>每天一个JavaScript实例-递归实现反转数组字符串</title> <script> var func = function(x,indx,str){ return
-
JS基于递归算法实现1,2,3,4,5,6,7,8,9倒序放入数组中的方法
本文实例讲述了JS基于递归算法实现1,2,3,4,5,6,7,8,9倒序放入数组中的方法.分享给大家供大家参考,具体如下: var array = [1, 2, 3, 4, 5, 6, 7, 8, 9]; function reverseDump(start) { start++; if (start > array.length / 2) { return; } var temp = array[start]; array[start] = array[array.length - start
-
利用java+mysql递归实现拼接树形JSON列表的方法示例
前言 本文给大家介绍的是关于利用java+mysql递归实现拼接树形JSON列表的相关内容,分享出来供大家参考学习,话不多说,来一起看看详细的介绍: 我们在做Java web项目时,前端控件例如国家-省-市-区-县等树形列表,常常需要多级树形json数据 例如: [ { "name": "商品目录", "pid": "-1", "id": "1", "children"
-
AngularJS递归指令实现Tree View效果示例
本文实例讲述了AngularJS递归指令实现Tree View效果的方法.分享给大家供大家参考,具体如下: 在层次数据结构展示中,树是一种极其常见的展现方式.比如系统中目录结构.企业组织结构.电子商务产品分类都是常见的树形结构数据. 这里我们采用Angular的方式来实现这类常见的tree view结构. 首先我们定义数据结构,采用以children属性来挂接子节点方式来展现树层次结构,示例如下: [ { "id":"1", "pid":&quo
-
JavaScript中递归实现的方法及其区别
递归函数:递归函数是在通过名字调用自身的情况下构成的. 递归实现阶乘函数: 方法一:通过使用函数的名字 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; }els
-
Javascript 实现匿名递归的实例代码
递归是一种常见的编程技巧,实名递归相信大家都不陌生,但如果想要实现匿名递归呢?比如想要返回一个匿名递归函数,又或者是定义一个匿名递归函数并直接调用它,该怎样去做呢?本文将来探讨一下它的实现. 实名递归 我们还是先从实名递归说起吧,还是用那个最简单的求阶乘的例子: function fact(n) { if (n < 2) { return n; } else { return n * fact(n - 1); } } console.log(fact(5)); 递归要求自己调用自己,如果函数有名
-
JavaScript异步上传图片文件的实例代码
html: <form action="url" enctype="multipart/form-data" id="myform" method="post"> <input accept="image/*" id="addfile" type="file" /> </form> jquery: $("#addfile&
-
JavaScript实现跑马灯抽奖活动实例代码解析与优化(一)
最近做了个项目,其中有项目需求是要实现跑马灯抽奖效果,实现此功能主要用到js相关知识,废话不多说,感兴趣的朋友可以阅读下全文. 开始之前先来看上篇文章遗漏的两个问题和几个知识点,是自己重构的过程中需要用到的: 1.移动端1px像素线的问题 对于设计师给我的手机端网页的设计稿都是2倍图.按照道理来说,在写网页的时候,所有对象的实际尺寸都是会除2.但是对于1像素的线呢? 先来看两张图,设计稿的效果: 在三星 S4下的实际显示效果: 可以看到这个时候1px的线竟然显示不出来了.这个问题是跟 S4手机的
-
JavaScript无缝滚动效果的实例代码
废话不多说了,直接给大家贴代码了,具体代码如下所示: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"&
-
JavaScript实现跑马灯抽奖活动实例代码解析与优化(二)
在上篇文章给大家介绍了JavaScript实现跑马灯抽奖活动实例代码解析与优化(一),既然是要编写插件.那么叫做"插件"的东西肯定是具有的某些特征能够满足我们平时开发的需求或者是提高我们的开发效率.那么叫做插件的东西应该具有哪些基本特征呢?让我们来总结一下: 1.JavaScript 插件一些基本特征: 配置一定要简单 插件中定义的变量不污染全局变量: 同一段代码可以在不同的地方复用: 用户可以自定义自己功能参数: 具有销毁变量和参数的功能: 如果按照以上的几个特征来写插件的话,我们可
-
JavaScript简单下拉菜单实例代码
本文实例讲述了JavaScript简单下拉菜单实例代码.分享给大家供大家参考.具体如下: 这是一款JavaScript实现的下拉菜单演示代码,带渐变效果的CSS+jQuery菜单,向下滑出型的菜单,最高支持两级,网上常见到的一种菜单风格,希望大家喜欢哦. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/js-simple-xlcd-down-menu-codes/ 具体代码如下: <!DOCTYPE html PUBLIC "-//W3C/
-
JavaScript下拉菜单功能实例代码
本文给大家分享一段实例代码关于js实现下拉菜单功能,具体代码如下所示: <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>下拉菜单</title> <style type="text/css"> body, ul, li { margin: 0; padding: 0; fo
-
javascript实现下雪效果【实例代码】
原理 : 1.js动态创建DIV,指定CLASS类设置不同的背景图样式显示不同的雪花效果. 2.js获取创建的DIV并改变其top属性值,当下落的高度大于屏幕高后删除该移动div 3.好像不够完善勿喷 HTML代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>雪花飞舞</title> <lin
-
JavaScript贪吃蛇小组件实例代码
1 写在前面 看来<JavsScript高级编程>,想做一个小demo练练自己的手,选择了贪吃蛇游戏.由于以前都是用c#写的,将贪吃蛇写到一个类里面,然后一个一个小方法的拆分,只向外提供需要提供的方法.这样就可以将贪吃蛇作为一个模块,任何地方都可以复用的.然而,用js进行编写的时候,由于不能很好的利用js语言的特性进行模块化编程,所以第一版的实现完全采用面向过程的方式,将函数中所需要的变量全部声明为全局变量.虽然这样也能够实现功能,但是做不到复用,而且定义非常多的最顶层变量,污染了全局变量.写
-
JavaScript判断日期时间差的实例代码
js判断日期时间的代码如下所示: alert(GetDateDiff("2018-02-27 19:20:22","2018-02-27 09:20:22","hour")); function GetDateDiff(startTime, endTime, diffType) { //将xxxx-xx-xx的时间格式,转换为 xxxx/xx/xx的格式 startTime = startTime.replace(/\-/g, "/&q
随机推荐
- java环境变量如何配置
- 在VMWare下LINUX中安装VMTool及共享文件夹
- PHP合并静态文件详解
- C#显示文件夹下所有图片文件的方法
- 客户端脚本中常常出现的一些问题和调试技巧
- 定时导出mysql本地数据替换远程数据库数据脚本分享
- 推荐一篇不错的新手asp编程的基本法则第1/2页
- div移动 输入框不能输入的问题
- linux下定时执行任务的方法及crontab 用法说明(收集整理)
- PuTTY登录设置的批量备份导出/导入
- SqlServer如何通过SQL语句获取处理器(CPU)、内存(Memory)、磁盘(Disk)以及操作系统相关信息
- jquery通过name属性取值的简单实现方法
- jQuery EasyUI封装简化操作
- jquery json 实例代码
- JS 组件系列之 bootstrap treegrid 组件封装过程
- Java利用cors实现跨域请求实例
- 使用ShellClass获取文件属性详细信息的实现方法
- php cli模式学习(PHP命令行模式)
- 详解几十行代码实现一个vue的状态管理
- Angular4.0动画操作实例详解