Javascript 實現(xiàn)匿名遞歸的實例代碼
遞歸是一種常見的編程技巧,實名遞歸相信大家都不陌生,但如果想要實現(xiàn)匿名遞歸呢?比如想要返回一個匿名遞歸函數(shù),又或者是定義一個匿名遞歸函數(shù)并直接調(diào)用它,該怎樣去做呢?本文將來探討一下它的實現(xiàn)。
實名遞歸
我們還是先從實名遞歸說起吧,還是用那個最簡單的求階乘的例子:
function fact(n) { if (n < 2) { return n; } else { return n * fact(n - 1); } } console.log(fact(5));
遞歸要求自己調(diào)用自己,如果函數(shù)有名字,這就太簡單不過了。
利用變量實現(xiàn)遞歸
函數(shù)還可以賦給一個變量,不過要實現(xiàn)遞歸,函數(shù)體里面還是要依賴這個變量名:
var f = function(n) { if (n < 2) { return n; } else { return n * f(n - 1); } } console.log(f(5));
應(yīng)該說這種方式跟之前的其實沒有本質(zhì)的不同。
匿名遞歸
現(xiàn)在我們來探討匿名遞歸的實現(xiàn)。
初步設(shè)想
如果想要返回一個匿名遞歸函數(shù),又或者是定義一個匿名遞歸函數(shù)并直接調(diào)用它:
(function (n) { if (n < 2) { return n; } else { return n * ?(n - 1); } })(5);
如果沒有一個名字,代碼中那個問號我們就不知道要填寫什么,就沒法形成遞歸了,此時我們要怎么辦呢?這時就要請出 arguments 對象了。
arguments 對象
在 javascript 的函數(shù)中,arguments 對象代表了實際調(diào)用時的參數(shù)對象。在我們的遞歸函數(shù)中,實際上我們也可以完全不用去定義“形式參數(shù)” n:
function factNoParam() { if (arguments[0] < 2) { return arguments[0]; } else { return arguments[0] * factNoParam(arguments[0] - 1); } } console.log(factNoParam(5));
只要我們在調(diào)用時傳入了實際的參數(shù),就可以用 arguments[0] 取得實際傳入的這個參數(shù)的值。
如果有更多的參數(shù),還可以 arguments[1],arguments[2] 等來取得。
arguments.callee 屬性
arguments 可以用來獲取參數(shù),相信你可能已經(jīng)知道了,但 arguments 對象其實還有一個屬性,即所謂的 callee。arguments.callee 代表了這個函數(shù)本身。這是什么意思呢?其實我們完全可以把 fact 寫成這樣:
function fact(n) { if (n < 2) { return n; } else { return n * arguments.callee(n - 1); } } console.log(fact(5));
那么它依然是遞歸的。因為 arguments.callee 實際就等于 fact。
那么,到了這里,有了這個屬性的幫助,要實現(xiàn)匿名遞歸就不難了,只要把 ? 改為 arguments.callee 即可:
(function (n) { if (n < 2) { return n; } else { return n * arguments.callee(n - 1); } })(5);
如果有需要,也可以把它作為匿名遞歸返回。
關(guān)于 javascript 實現(xiàn)匿名遞歸的介紹就到這里。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 利用java+mysql遞歸實現(xiàn)拼接樹形JSON列表的方法示例
- JS基于遞歸算法實現(xiàn)1,2,3,4,5,6,7,8,9倒序放入數(shù)組中的方法
- Vue.js 遞歸組件實現(xiàn)樹形菜單(實例分享)
- JS基于遞歸實現(xiàn)倒計時效果的方法
- AngularJS遞歸指令實現(xiàn)Tree View效果示例
- java、js中實現(xiàn)無限層級的樹形結(jié)構(gòu)方法(類似遞歸)
- javascript實現(xiàn)網(wǎng)頁子頁面遍歷回調(diào)的方法(涉及 window.frames、遞歸函數(shù)、函數(shù)上下文)
- 一個JavaScript遞歸實現(xiàn)反轉(zhuǎn)數(shù)組字符串的實例
- JavaScript中遞歸實現(xiàn)的方法及其區(qū)別
相關(guān)文章
基于JS實現(xiàn)html中placeholder屬性提示文字效果示例
這篇文章主要介紹了基于JS實現(xiàn)html中placeholder屬性提示文字效果,涉及javascript事件響應(yīng)及頁面元素屬性動態(tài)操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2018-04-04JavaScript中yield實用簡潔實現(xiàn)方式
原以為是一個蠻復(fù)雜的題目,想了許久沒思路,當(dāng)然要實現(xiàn)絕對能實現(xiàn),但如果分析JavaScript腳本或是動態(tài)產(chǎn)生代碼,都太復(fù)雜了。2010-06-06關(guān)于javascript模塊加載技術(shù)的一些思考
這篇文章主要介紹了關(guān)于javascript模塊加載技術(shù)的一些思考 ,需要的朋友可以參考下2014-11-11瀏覽器視頻幀操作方法?requestVideoFrameCallback()
這篇文章主要介紹了瀏覽器視頻幀操作方法?requestVideoFrameCallback(),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-07-07JavaScript實現(xiàn)動態(tài)數(shù)據(jù)可視化的示例詳解
動態(tài)數(shù)據(jù)可視化能夠?qū)⒋罅繑?shù)據(jù)以直觀、生動的方式呈現(xiàn),幫助用戶更好地理解和分析數(shù)據(jù),本文主要為大家介紹了如何使用JavaScript實現(xiàn)這一功能,需要的可以參考下2024-02-02JavaScript導(dǎo)航腳本判斷當(dāng)前導(dǎo)航
這篇文章主要介紹了JavaScript導(dǎo)航腳本判斷當(dāng)前導(dǎo)航的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-07-07