所谓的递归函数就是在函数体内调用本函数。使用递归函数一定要注意,处理不当就会进入死循环。递归函数只有在特定的情况下使用 ,比如阶乘问题

下面我们就做一个10以内的阶乘试试看吧:

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

递归函数的调用就说这么多了

js递归函数调用自身时的保险方式。

来自js高级程序设计

一个典型阶乘递归函数:

function fact(num){

if (num<=1){

return 1;

}else{

return num*fact(num-1);

}

}

以下代码可导致出错:

var anotherFact = fact;

fact = null;

alert(antherFact(4)); //出错

由于fact已经不是函数了,所以出错。

用arguments.callee可解决问题,这是一个指向正在执行的函数的指针。

新的函数为:

function fact(num){

if (num<=1){

return 1;

}else{

return num*arguments.callee(num-1); //此处更改了。

}

}

var anotherFact = fact;

fact = null;

alert(antherFact(4)); //结果为24.

JS普通递归的改进

递归函数是在一个函数通过名字调用自身的情况下构成的,如下所示:

function factorial(num)

{

if(num<=1)

{

return 1;

}

else

{

return num * factorial(num-1);

}

}

这是一个经典的阶乘函数。表面看来没有什么问题,但下面的代码却可能导致它出错。

var anotherFactorial = factorial;

anotherFactorial(4); //输出 24

factorial = null;

anotherFactorial (4); //TypeError: Property 'factorial' of object [object Window] is not a function chrome 下测试

原因在于,我们定义的函数名,其实是指向函数的一个指针,此时定义了anotherFactorial 也指向了那个函数,所以调用anotherFactorial (4)可以成功的输出24

此时 factorial = null; 那么执行定义函数的引用就剩下了anotherFactorial,那么在调用anotherFactorial(4)就会显示以上的错误的信息。

此时可以使用arguments.callee来替代函数定义中的 factorial,

函数的定义就变成了:

function factorial(num)

{

if(num<=1)

{

return 1;

}

else

{

return num * arguments.callee(num-1);

}

}

那么在使用上面的4行测试代码,最后一行测试代码也可以成功的输出24.

--------------------------------------

上述的内容摘自<<JavaScript高级程序设计>>第2版 144页 7.1节

浅谈-js递归函数的更多相关文章

  1. 浅谈JS之AJAX

    0x00:什么是Ajax? Ajax是Asynchronous Javascript And Xml 的缩写(异步javascript及xml),Ajax是使用javascript在浏览器后台操作HT ...

  2. 浅谈JS中的闭包

    浅谈JS中的闭包 在介绍闭包之前,我先介绍点JS的基础知识,下面的基础知识会充分的帮助你理解闭包.那么接下来先看下变量的作用域. 变量的作用域 变量共有两种,一种为全局变量,一种为局部变量.那么全局变 ...

  3. 浅谈 js 正则字面量 与 new RegExp 执行效率

    原文:浅谈 js 正则字面量 与 new RegExp 执行效率 前几天谈了正则匹配 js 字符串的问题:<js 正则学习小记之匹配字符串> 和 <js 正则学习小记之匹配字符串优化 ...

  4. 浅谈 js 字符串之神奇的转义

    原文:浅谈 js 字符串之神奇的转义 字符串在js里是非常常用的,但是你真的了解它么?翻阅<MDN String>就可以了解它的常见用法了,开门见山的就让你了解了字符串是怎么回事. 'st ...

  5. 浅谈 js 正则之 test 方法

    原文:浅谈 js 正则之 test 方法 其实我很少用这个,所以之前一直没注意这个问题,自从落叶那厮写了个变态的测试我才去看了下这东西.先来看个东西吧. var re = /\d/; console. ...

  6. 浅谈 js 数字格式类型

    原文:浅谈 js 数字格式类型 很多人也许只知道 ,123.456,0xff 之类的数字格式.其实 js 格式还有很多数字格式类型,比如 1., .1 这样的,也有 .1e2 这样的. 可能有人说这是 ...

  7. 浅谈 js 语句块与标签

    原文:浅谈 js 语句块与标签 语句块是什么?其实就是用 {} 包裹的一些js代码而已,当然语句块不能独立作用域.可以详细参见这里<MDN block> 也许很多人第一印象 {} 不是对象 ...

  8. 浅谈 js 字符串 trim 方法之正则篇

    原文:浅谈 js 字符串 trim 方法之正则篇 关于 trim 其实没啥好说的,无非就是去除首位空格,对于现代浏览器来说只是简单的正则 /^\s+|\s+$/ 就可以搞定了.而且支持中文空格   等 ...

  9. 浅谈 js 字符串 search 方法

    原文:浅谈 js 字符串 search 方法 这是一个很久以前的事情了,好像是安心兄弟在学习js的时候做的练习.具体记不清了,今天就来简单分析下 search 究竟是什么用的. 从字面意思理解,一个是 ...

随机推荐

  1. 用jQuery重置用于文件上传的input (type="file")

    页面中有如下标签: <input type="file" id="upload"/> 此标签本用于文件上传,现在有需要将其值重置为空.于是想当然地写 ...

  2. Hover.css:一组超实用的 CSS3 悬停效果和动画

    Hover.css 是一套基于 CSS3 的鼠标悬停效果和动画,这些可以非常轻松的被应用到按钮.LOGO 以及图片等元素.所有这些效果都是只需要单一的标签,必要的时候使用 before 和 after ...

  3. Windows Azure Cloud Service (47) 修改Cloud Service时区

    <Windows Azure Platform 系列文章目录> 本文介绍内容适合于Azure Global和Azure China 我们在使用Cloud Service的时候,会发现默认的 ...

  4. Windows Azure Virtual Machine (31) 迁移Azure虚拟机

    <Windows Azure Platform 系列文章目录> 为什么要写这篇Blog? 之前遇到过很多客户提问: (1)我之前创建的虚拟机,没有加入虚拟网络.现在需要重新加入虚拟机网络, ...

  5. Windows Azure Virtual Network (8) 创建Azure Point-to-Site点到站点 VPN

    <Windows Azure Platform 系列文章目录> 我们在使用Azure的时候,常常有这样的需求: -我需要将企业内网的主机连接到微软Azure公有云平台 -我需要保证企业内部 ...

  6. 【Android学习笔记】XmlResourceParser解析xml文件

    最近学习Android时,需要用到解析XML文件里的数据,可以用XmlResourceParser来解析xml文件,正好将此记录下来. XmlResourceParser里常用的字段和方法 首先先给出 ...

  7. 开源通信(C#)__

    GitHub中的README文件,使用markdown格式的文件. 下面简单介绍下相关语法: 大标题: =================================== 大标题一般显示工程名,你 ...

  8. block,inline,inline-block的区别

    block: 英语翻译过来是“块”意思,就跟小时候玩过的积木方块一样,一块一块往上搭. inline: 英语翻译过来就是“内联”的意思,内联不好理解,我的理解就是行内元素: block和inline都 ...

  9. 【转载】Visaul Studio 常用快捷键的动画演示

    在进行代码开发的时候,我们往往会频繁的使用键盘.鼠标进行协作,但是切换使用两种工具会影响到我们的开发速度,如果所有的操作都可以只用键盘来完成,那开发效率将得到大幅度的提升.因此,灵活地应用 Visua ...

  10. 使用MVVM-Sidekick开发Universal App(一)

    终于要迈进Universal的大坑了,还有点小激动呢. CurrencyExchanger 掌中汇率是我前几年发布在Windows Phone商店中的一个应用,当时是WP7版本,下载链接:http:/ ...