码迷,mamicode.com
首页 > 编程语言 > 详细

JavaScript中的递归函数问题

时间:2015-03-15 15:22:51      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:javascript 深入理解java

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

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)
		}
	});
完辣。。。



JavaScript中的递归函数问题

标签:javascript 深入理解java

原文地址:http://blog.csdn.net/u014209090/article/details/44276621

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!