javascript匿名透明递归

一、补充知识 argument.callee

首先看一个经典的阶乘例子(用递归实现,当然你也可以用迭代~):

<script type="text/javascript">
	function factorial(num) {
		if(num < 1) {
			return 1;
		}
		else {
			return num*factorial(num-1);
		}
	}
</script>

我们用到了递归算法。不过可以看到,这个函数的执行与函数名factorial紧紧耦合在了一起。为了消除这种耦合(即,实现低耦合),可以使用arguments.callee。

arguments对象的callee的属性是一个指针,指向拥有这个arguments对象的函数。

如下:

<script type="text/javascript">
	function factorial(num) {
		if(num <= 1) {
			return 1;
		}
		else {
			return num*arguments.callee(num - 1);
		}
	}
</script>


二、万事俱备,实现javascript匿名透明递归

(以下内容摘自luoluo牛的博客

什么是匿名透明递归,就是递归调用的时候不需要知道函数名,也不需要理解参数。用到的知识点:

1、arguments对象的callee属性,取得当前函数对象,实现 函数匿名引用

2、Function对象的apply方法(见MSDN手册),调用一个方法,并传入this指针和arguments对象,这样就实现参数透明传递


实现:

<script type="text/javascript">
(function(s, n) {
    alert(n);

    if (n < 5) {
        n ++;
        arguments.callee.apply(this, arguments);
    }
})("test", 0);
</script>


三、参考:

1.http://www.cnblogs.com/luoluo/archive/2009/04/20/1440054.html

2.http://msdn.microsoft.com/zh-cn/library/4zc42wh1(v=vs.94).aspx

3.http://www.w3cmm.com/javascript/arguments-callee.html




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值