先看下代碼:
function factorial(num){
if(num<=1){
return 1;
}else{
return num*factorial(num-1);
}
}
var anotherFactorial=factorial;
factorial=null;
alert(anotherFactorial(4));
一看這是一段很典型的遞歸階乘函數(shù)
不過細(xì)心一看不難發(fā)現(xiàn),這段code有一個(gè)很大的bug
執(zhí)行的時(shí)候?qū)?huì)將會(huì)報(bào)錯(cuò)
原因就在于 factorial=null 這一句,可別忘了我們在factorial 遞歸時(shí)引用了自身的
當(dāng)我們將factorial復(fù)制給 anotherFactorial 時(shí),這并沒什么問題,問題就在factorial=null,由于遞歸體調(diào)用了自身,故清除原函數(shù)無非是“自殺行為”還好JS提供了處理類似問題的方法:argument.callee
該方法是一個(gè)指向正在執(zhí)行的函數(shù)的指針,因此可以用她來實(shí)現(xiàn)對函數(shù)的遞歸調(diào)用
修正后的code
function factorial(num){
if(num<=1){
return 1;
}else{
return num*arguments.callee(num-1);
}
}
var anotherFactorial=factorial;
factorial=null;
alert(anotherFactorial(4));
但是在嚴(yán)格模式下,上面那段修正后的code又有問題了
因?yàn)樵趪?yán)格模式下 不能通過腳本訪問argument.call ,訪問這個(gè)屬性會(huì)導(dǎo)致錯(cuò)誤。
解決這個(gè)問題可以用命名函數(shù)表達(dá)式
var factorial=(function f(num){
if(num<=1){
return 1;
}else{
return num*f(num-1);
}
});
var anotherFactorial=factorial;
factorial=null;
alert(anotherFactorial(4));