JavaScript中的递归函数问题

学过其他编程语言的都应该会知道递归这个问题,递归函数是在一个函数通过名字调用自身的情况下后构成的。

function fac(num){
		if(num<=1){
			return 1;
		}else{
			return num*fac(num-1);
		}
	}

这是一个比较经典的阶乘算法,这个写法就实现我们所说的递归。这个代码看起来是没有什么问题, 在c或者其他编程语言都有这样的描述,但是在JavaScript中有时就会出错。就比如:

<span style="white-space:pre">	</span>var myfac=fac;
	fac=null;
	console.log(myfac(4));//出错了

为什么会出错呢?

按照道理fac把原始函数引用给了myfac,然后将fac置为空,指向原始函数的引用依然在myfac中,应该可以访问到才对啊!这个就出现问题了,在调用myfac的时候,由于必须执行fac(),而此时fac已经不再是一个函数了,所以才会导致错误,在这种情况下使用arguments.callee(指向正在执行的函数)可以解决这个问题。

function fac(num){
		if(num<=1){
			return 1;
		}else{
			return num*arguments.callee(num-1);
		}
	}

通过使用arguments.callee代替函数名,可以确保无论怎么调用函数都不会出问题,所以,在编写递归函数时,使用arguments.calllee()总比使用函数名要保险得多。

但在严格模式下,是不能够通过脚本访问arguments.callee的,访问这个属性会导致错误,不过可以使用命名函数表达式来达到相同的效果。

var fac=(function f(num){
		if(num<=1){
			return 1;

		}else{
			return num*f(num-1)
		}
	});

完辣。。。

时间: 2024-10-12 17:03:34

JavaScript中的递归函数问题的相关文章

Javascript 中的回调函数和递归函数简单实际分析学习

Javascript 中的回调函数和递归函数简单实际分析学习 1 回调函数 所谓回调函数简单理解就是将一个函数做为参数传递给其他的函数供其使用.(只是在js中,因为其它的语言中有指针这个概念). 举一个简单的例子,当我们在统计账单的时候就要整理材料这些,然后就需要计算器,计算器我们想象成为一个可以实现计算的函数.统计账单是另外的另一个函数,当统计账单的时候就会需要计算器这个函数的支持,其实这就是一个简单的回调.可以按这个理解. 下来我借用网上的一个例子: //先定义一个函数fun1 functi

javascript 中caller,callee,call,apply 的概念[转载]

在提到上述的概念之前,首先想说说javascript中函数的隐含参数:arguments Arguments : 该对象代表正在执行的函数和调用它的函数的参数. [function.]arguments[n] 参数function :选项.当前正在执行的 Function 对象的名字. n :选项, 要传递给 Function 对象的从0开始的参数值索引. 说明Arguments :是进行函数调用时,除了指定的参数外,还另外创建的一个隐藏对象.Arguments是一个类似数组但不是数组的对象,说

Javascript中递归造成的堆栈溢出及解决方案

关于堆栈的溢出问题,在Javascript日常开发中很常见,Google了下,相关问题还是比较多的.本文旨在描述如何解决此类问题. 首先看一个实例(当然你可以使用更容易的方式实现,这里我们仅探讨递归): function isEven (num) { if (num === 0) { return true; } if (num === 1) { return false; } return isEven(Math.abs(num) - 2); } //Outputs: true console

JavaScript中的arguments,callee,caller

在提到上述的概念之前,首先想说说javascript中函数的隐含参数: arguments: arguments 该对象代表正在执行的函数和调用它的函数的参数. [function.]arguments[n]参数function:选项.当前正在执行的 Function 对象的名字. n :选项.要传递给 Function 对象的从0开始的参数值索引.说明Arguments是进行函数调用时,除了指定的参数外,还另外创建的一个隐藏对象.Arguments是一个类似数组但不是数组的对象,说它类似数组是

JavaScript中执行环境和栈

在这篇文章中,我会深入理解JavaScript最根本的组成之一 : "执行环境(执行上下文)".文章结束后,你应该对解释器试图做什么,为什么一些函数/变量在未声明时就可以调用并且他们的值是如何确定的有一个清晰的认识. 什么是执行环境(执行上下文)当代码在JavaScript中运行的时候,代码在环境中被执行是非常重要的,它会被评估为以下之一类型来运行:全局代码:默认环境,你的代码第一时间在这儿运行.函数代码:当执行流进入一个函数体的时候.Eval代码:在eval()函数中的文本. 你可以

一篇文章带你了解JavaScript中的函数表达式,递归,闭包,变量,this对象,模块作用域

作者 | Jeskson 来源 | 达达前端小酒馆 定义函数的方式: 第一种为 函数声明: 第二种为 函数表达式. 语法: function functionName(arg0, arg1, arg2) { // 函数体 } 在Firefox,Safari,Chrome和Opera有效: 就是通过这个属性可以访问到这个函数指定的名字. console.log(functionName.name); // 'functionName' 函数声明: 它的一个重要特点就是:函数声明提升,就是在执行代码

实现一个函数clone,使JavaScript中的5种主要的数据类型(包括Number、String、Object、Array、Boolean)进行值复制

实现一个函数clone,可以对JavaScript中的5种主要的数据类型(包括Number.String.Object.Array.Boolean)进行值复制. 1 /** 对象克隆 2 * 支持基本数据类型及对象 3 * 递归方法 */ 4 function clone(obj) { 5 var o; 6 switch (typeof obj) { 7 case "undefined": 8 break; 9 case "string": o = obj + &q

javascript中的原始值和复杂值

前面的话 javascript的数据类型可以分为两种:原始类型(基本类型或者简单类型)和引用类型. 原始类型:Undefined,Null,Boolean,Number,String五种: 引用类型:Object,Array,Function: 与此相对应的,它们的值分别被称为原始值和复杂值. 特性 原始值 原始值是表示javascript中可用的数据或信息的最底层的形式或者最简单的形式.原始类型的值被称为原始值,因为它们的值是不可被细化的.也就是说,数字是数字,字符串是字符串,布尔值是true

【JS】JavaScript中的执行环境与作用域

JavaScript中的执行环境定义了变量或函数有权访问的数据(每个函数都有自己的执行环境),全局执行环境是最外围的执行环境,在浏览器中,全局执行环境就是window对象,所以所有的全局变量和函数都是作为window对象的属性和方法创建的.当某一个执行环境中所有代码执行完成后,该环境就被销毁,保存在其中的变量和函数也将被销毁,全局执行环境在关闭网页或浏览器时才被销毁. 当代码在一个环境中执行时,会创建变量对象的一个作用域链(保证对执行环境有权访问的变量和函数的有序访问),如果环境是函数,将其活动