Javascript 實(shí)現(xiàn)匿名遞歸的實(shí)例代碼
遞歸是一種常見(jiàn)的編程技巧,實(shí)名遞歸相信大家都不陌生,但如果想要實(shí)現(xiàn)匿名遞歸呢?比如想要返回一個(gè)匿名遞歸函數(shù),又或者是定義一個(gè)匿名遞歸函數(shù)并直接調(diào)用它,該怎樣去做呢?本文將來(lái)探討一下它的實(shí)現(xiàn)。
實(shí)名遞歸
我們還是先從實(shí)名遞歸說(shuō)起吧,還是用那個(gè)最簡(jiǎn)單的求階乘的例子:
function fact(n) {
if (n < 2) {
return n;
} else {
return n * fact(n - 1);
}
}
console.log(fact(5));
遞歸要求自己調(diào)用自己,如果函數(shù)有名字,這就太簡(jiǎn)單不過(guò)了。
利用變量實(shí)現(xiàn)遞歸
函數(shù)還可以賦給一個(gè)變量,不過(guò)要實(shí)現(xiàn)遞歸,函數(shù)體里面還是要依賴(lài)這個(gè)變量名:
var f = function(n) {
if (n < 2) {
return n;
} else {
return n * f(n - 1);
}
}
console.log(f(5));
應(yīng)該說(shuō)這種方式跟之前的其實(shí)沒(méi)有本質(zhì)的不同。
匿名遞歸
現(xiàn)在我們來(lái)探討匿名遞歸的實(shí)現(xiàn)。
初步設(shè)想
如果想要返回一個(gè)匿名遞歸函數(shù),又或者是定義一個(gè)匿名遞歸函數(shù)并直接調(diào)用它:
(function (n) {
if (n < 2) {
return n;
} else {
return n * ?(n - 1);
}
})(5);
如果沒(méi)有一個(gè)名字,代碼中那個(gè)問(wèn)號(hào)我們就不知道要填寫(xiě)什么,就沒(méi)法形成遞歸了,此時(shí)我們要怎么辦呢?這時(shí)就要請(qǐng)出 arguments 對(duì)象了。
arguments 對(duì)象
在 javascript 的函數(shù)中,arguments 對(duì)象代表了實(shí)際調(diào)用時(shí)的參數(shù)對(duì)象。在我們的遞歸函數(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));
只要我們?cè)谡{(diào)用時(shí)傳入了實(shí)際的參數(shù),就可以用 arguments[0] 取得實(shí)際傳入的這個(gè)參數(shù)的值。
如果有更多的參數(shù),還可以 arguments[1],arguments[2] 等來(lái)取得。
arguments.callee 屬性
arguments 可以用來(lái)獲取參數(shù),相信你可能已經(jīng)知道了,但 arguments 對(duì)象其實(shí)還有一個(gè)屬性,即所謂的 callee。arguments.callee 代表了這個(gè)函數(shù)本身。這是什么意思呢?其實(shí)我們完全可以把 fact 寫(xiě)成這樣:
function fact(n) {
if (n < 2) {
return n;
} else {
return n * arguments.callee(n - 1);
}
}
console.log(fact(5));
那么它依然是遞歸的。因?yàn)?arguments.callee 實(shí)際就等于 fact。
那么,到了這里,有了這個(gè)屬性的幫助,要實(shí)現(xiàn)匿名遞歸就不難了,只要把 ? 改為 arguments.callee 即可:
(function (n) {
if (n < 2) {
return n;
} else {
return n * arguments.callee(n - 1);
}
})(5);
如果有需要,也可以把它作為匿名遞歸返回。
關(guān)于 javascript 實(shí)現(xiàn)匿名遞歸的介紹就到這里。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 利用java+mysql遞歸實(shí)現(xiàn)拼接樹(shù)形JSON列表的方法示例
- JS基于遞歸算法實(shí)現(xiàn)1,2,3,4,5,6,7,8,9倒序放入數(shù)組中的方法
- Vue.js 遞歸組件實(shí)現(xiàn)樹(shù)形菜單(實(shí)例分享)
- JS基于遞歸實(shí)現(xiàn)倒計(jì)時(shí)效果的方法
- AngularJS遞歸指令實(shí)現(xiàn)Tree View效果示例
- java、js中實(shí)現(xiàn)無(wú)限層級(jí)的樹(shù)形結(jié)構(gòu)方法(類(lèi)似遞歸)
- javascript實(shí)現(xiàn)網(wǎng)頁(yè)子頁(yè)面遍歷回調(diào)的方法(涉及 window.frames、遞歸函數(shù)、函數(shù)上下文)
- 一個(gè)JavaScript遞歸實(shí)現(xiàn)反轉(zhuǎn)數(shù)組字符串的實(shí)例
- JavaScript中遞歸實(shí)現(xiàn)的方法及其區(qū)別
相關(guān)文章
JavaScript 里的類(lèi)數(shù)組對(duì)象
這篇文章主要介紹了JavaScript 里的類(lèi)數(shù)組對(duì)象的相關(guān)資料,需要的朋友可以參考下2015-04-04
JavaScript架構(gòu)前端不能沒(méi)有監(jiān)控系統(tǒng)原因
這篇文章主要為大家介紹了為什么前端不能沒(méi)有監(jiān)控系統(tǒng)的原因,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
javascript實(shí)現(xiàn)動(dòng)態(tài)CSS換膚技術(shù)的腳本
javascript實(shí)現(xiàn)動(dòng)態(tài)CSS換膚技術(shù)的腳本...2007-06-06
Three光源Target位置改變光照方向不變的問(wèn)題解決方法
這篇文章主要為大家介紹了Three光源Target位置改變光照方向不變的問(wèn)題及解決方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
微信小程序如何調(diào)用json數(shù)據(jù)接口并解析
這篇文章主要介紹了微信小程序如何調(diào)用json數(shù)據(jù)接口并解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-06-06
關(guān)于原生js中bind函數(shù)的簡(jiǎn)單實(shí)現(xiàn)
下面小編就為大家?guī)?lái)一篇關(guān)于原生js中bind函數(shù)的簡(jiǎn)單實(shí)現(xiàn)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08
JavaScript中的二進(jìn)制數(shù)據(jù)處理方法詳解
Blob、ArrayBuffer和Buffer是JavaScript中用于表示和操作二進(jìn)制數(shù)據(jù)的三種主要方式,本文將深入探討這些概念,以及它們?nèi)绾卧贘avaScript中使用,需要的可以參考一下2023-06-06
分享JavaScript監(jiān)聽(tīng)全部Ajax請(qǐng)求事件的方法
最近在做一個(gè)小項(xiàng)目,引入了第三方j(luò)s文件,這個(gè)文件會(huì)調(diào)用XMLHttpRequest向服務(wù)器發(fā)送 Ajax請(qǐng)求,但是我有需要監(jiān)聽(tīng)其Ajax請(qǐng)求的某些事件,以便額外地執(zhí)行其他腳本。于是稍微看了看監(jiān)聽(tīng) Ajax請(qǐng)求的事件方法,在這里分享給大家。有需要的朋友們可以參考借鑒。2016-08-08

