1.通过函数自身名字递归调用
function sum(num){
if(num<=1){
return 1;
}else{
return num+sum(num-1);
}
}
console.log(sum(5));//15
这种通过函数名字调用自身的方式存在一个问题:函数的名字是一个指向函数对象的指针,如果我们把函数的名字与函数对象本身的指向关系断开,这种方式运行时将出现错误。
2.通过arguments.callee调用函数自身
function sum(num){
if(num<=1){
return 1;
}else{
return num+arguments.callee(num-1);
}
}
console.log(sum(5));//15
var sumAnother=sum;
console.log(sumAnother(5));//15
sum=null;
console.log(sumAnother(5));//15
这种方式很好的解决了函数名指向变更时导致递归调用时找不到自身的问题。但是这种方式也不是很完美,因为在严格模式下是禁止使用arguments.callee的。
3.通过函数命名表达式来实现arguments.callee的效果。
var sum=(function(){
'use strict'
return function fun(num){
if(num<=1){
return 1;
}else{
return num+fun(num-1);
}
}
})()
console.log(sum(5));//15
var sumAnother=sum;
console.log(sumAnother(5));//15
sum=null;
console.log(sumAnother(5));//15
|
|