JS經(jīng)典遞歸及其易錯(cuò)點(diǎn)

先看下代碼:

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));  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Lua 5.1 參考手冊 by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 14,235評論 0 38
  • ??函數(shù)表達(dá)式是 JavaScript 中的一個(gè)既強(qiáng)大有容易令人困惑的特性。定義函數(shù)的的方式有兩種: 函數(shù)聲明; ...
    霜天曉閱讀 887評論 0 1
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,667評論 0 4
  • 今天踢了一場友誼足球賽,輸了,很是失望,本來我一個(gè)帶球欲望比誰都強(qiáng)烈的人都能為了贏球委身做個(gè)中場,但是一群新手在哪...
    派斯卡特閱讀 347評論 1 0
  • 哄小轟閱讀 189評論 0 0

友情鏈接更多精彩內(nèi)容