JavaScript 函數(shù)表達(dá)式(一)遞歸

遞歸函數(shù)是在一個(gè)函數(shù)通過(guò)名字調(diào)用自身的情況下構(gòu)成的。

function factorial(num) {
    if (num <= 1) {
        return 1;
    } else {
        return num * factorial(num - 1);
    }
}

上例是一個(gè)經(jīng)典的遞歸階乘函數(shù)。雖然這個(gè)函數(shù)表面看來(lái)沒(méi)什么問(wèn)題,但下面的代碼卻可能導(dǎo)致它出錯(cuò)。

var anotherFactorial = factorial;
factorial = null
alert(anotherFactorial(4)); // error

上例代碼先把 factorial() 函數(shù)保存在變量 anotherFactorial 中,然后將 factorial 變量設(shè)置為 null,結(jié)果指向原始函數(shù)的引用只剩下一個(gè)。但在接下來(lái)調(diào)用 anotherFactorial() 時(shí),由于必須執(zhí)行 factorial(),而 factorial 已經(jīng)不再是函數(shù),所以就會(huì)導(dǎo)致錯(cuò)誤。

在這種情況下可以使用 arguments.callee 可以解決這個(gè)問(wèn)題。

arguments.callee 是一個(gè)指向正在執(zhí)行的函數(shù)的指針,因此可以用它來(lái)實(shí)現(xiàn)對(duì)函數(shù)的遞歸調(diào)用。

function factorial(num) {
    if (num <= 1) {
        return 1;
    } else {
        return num * arguments.callee(num - 1);
    }
}

通過(guò)使用 arguments.callee 代替函數(shù)名,可以確保無(wú)論怎樣調(diào)用函數(shù)都不會(huì)出問(wèn)題。在編寫(xiě)遞歸函數(shù)時(shí),使用 argument.callee 總比使用函數(shù)名保險(xiǎn)

注意:在嚴(yán)格模式下,不能通過(guò)腳本訪問(wèn) arguments.callee 訪問(wèn)這個(gè)屬性會(huì)導(dǎo)致錯(cuò)誤。不過(guò)可以使用命名函數(shù)表達(dá)式來(lái)達(dá)成相同的結(jié)果。

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

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

  • 定義函數(shù)的方式有兩種:函數(shù)聲明和函數(shù)表達(dá)式。 函數(shù)聲明的一個(gè)重要特征就是函數(shù)聲明提升,意思是在執(zhí)行代碼前會(huì)先讀取函...
    oWSQo閱讀 743評(píng)論 0 0
  • 第5章 引用類型(返回首頁(yè)) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,683評(píng)論 0 4
  • 本文檔內(nèi)容參考 《JavaScript 闖關(guān)記》之函數(shù) 函數(shù)是一段代碼,它只定義一次,但可以被執(zhí)行或調(diào)用任意次。在...
    穿越人海遇見(jiàn)你閱讀 1,114評(píng)論 0 1
  • 就這樣在學(xué)校里碰見(jiàn)兔子, 我這樣平庸之輩也能碰見(jiàn)愛(ài)情,開(kāi)始害怕。美的像夢(mèng)。害怕醒過(guò)來(lái)就沒(méi)了。
    安定心閱讀 261評(píng)論 0 0
  • 2017年已經(jīng)到了,也該為自己這一年好好制定可執(zhí)行的行動(dòng)規(guī)劃了,往年總是給自己設(shè)定好多目標(biāo),可到年底回顧的時(shí)候,才...
    張景霞閱讀 262評(píng)論 1 0

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