最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Javascript 實現匿名遞歸的實例代碼

 更新時間:2017年05月25日 09:55:55   作者:肖國棟  
本篇文章主要介紹了Javascript 實現匿名遞歸的實例代碼,利用 arguments.callee 來實現匿名遞歸的方式。有興趣的可以了解一下

遞歸是一種常見的編程技巧,實名遞歸相信大家都不陌生,但如果想要實現匿名遞歸呢?比如想要返回一個匿名遞歸函數,又或者是定義一個匿名遞歸函數并直接調用它,該怎樣去做呢?本文將來探討一下它的實現。

實名遞歸

我們還是先從實名遞歸說起吧,還是用那個最簡單的求階乘的例子:

function fact(n) {
 if (n < 2) {
  return n;
 } else {
  return n * fact(n - 1);
 }
}
console.log(fact(5));

遞歸要求自己調用自己,如果函數有名字,這就太簡單不過了。

利用變量實現遞歸

函數還可以賦給一個變量,不過要實現遞歸,函數體里面還是要依賴這個變量名:

var f = function(n) {
 if (n < 2) {
  return n;
 } else {
  return n * f(n - 1);
 }
}
console.log(f(5));

應該說這種方式跟之前的其實沒有本質的不同。

匿名遞歸

現在我們來探討匿名遞歸的實現。

初步設想

如果想要返回一個匿名遞歸函數,又或者是定義一個匿名遞歸函數并直接調用它:

(function (n) {
 if (n < 2) {
  return n;
 } else {
  return n * ?(n - 1);
 }
})(5);

如果沒有一個名字,代碼中那個問號我們就不知道要填寫什么,就沒法形成遞歸了,此時我們要怎么辦呢?這時就要請出 arguments 對象了。

arguments 對象

在 javascript 的函數中,arguments 對象代表了實際調用時的參數對象。在我們的遞歸函數中,實際上我們也可以完全不用去定義“形式參數” n:

function factNoParam() {
 if (arguments[0] < 2) {
  return arguments[0];
 } else {
  return arguments[0] * factNoParam(arguments[0] - 1);
 }
}
console.log(factNoParam(5));

只要我們在調用時傳入了實際的參數,就可以用 arguments[0] 取得實際傳入的這個參數的值。

如果有更多的參數,還可以 arguments[1],arguments[2] 等來取得。

arguments.callee 屬性

arguments 可以用來獲取參數,相信你可能已經知道了,但 arguments 對象其實還有一個屬性,即所謂的 callee。arguments.callee 代表了這個函數本身。這是什么意思呢?其實我們完全可以把 fact 寫成這樣:

function fact(n) {
 if (n < 2) {
  return n;
 } else {
  return n * arguments.callee(n - 1);
 }
}
console.log(fact(5));

那么它依然是遞歸的。因為 arguments.callee 實際就等于 fact。

那么,到了這里,有了這個屬性的幫助,要實現匿名遞歸就不難了,只要把 ? 改為 arguments.callee 即可:

(function (n) {
 if (n < 2) {
  return n;
 } else {
  return n * arguments.callee(n - 1);
 }
})(5);

如果有需要,也可以把它作為匿名遞歸返回。

關于 javascript 實現匿名遞歸的介紹就到這里。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 控制打印時頁眉角的代碼

    控制打印時頁眉角的代碼

    控制打印時頁眉角的代碼...
    2007-02-02
  • JavaScript 里的類數組對象

    JavaScript 里的類數組對象

    這篇文章主要介紹了JavaScript 里的類數組對象的相關資料,需要的朋友可以參考下
    2015-04-04
  • JavaScript架構前端不能沒有監(jiān)控系統(tǒng)原因

    JavaScript架構前端不能沒有監(jiān)控系統(tǒng)原因

    這篇文章主要為大家介紹了為什么前端不能沒有監(jiān)控系統(tǒng)的原因,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • javascript實現動態(tài)CSS換膚技術的腳本

    javascript實現動態(tài)CSS換膚技術的腳本

    javascript實現動態(tài)CSS換膚技術的腳本...
    2007-06-06
  • Three光源Target位置改變光照方向不變的問題解決方法

    Three光源Target位置改變光照方向不變的問題解決方法

    這篇文章主要為大家介紹了Three光源Target位置改變光照方向不變的問題及解決方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • 用js實現猜數字小游戲

    用js實現猜數字小游戲

    這篇文章主要為大家詳細介紹了用js實現猜數字小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 微信小程序如何調用json數據接口并解析

    微信小程序如何調用json數據接口并解析

    這篇文章主要介紹了微信小程序如何調用json數據接口并解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-06-06
  • 關于原生js中bind函數的簡單實現

    關于原生js中bind函數的簡單實現

    下面小編就為大家?guī)硪黄P于原生js中bind函數的簡單實現。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • JavaScript中的二進制數據處理方法詳解

    JavaScript中的二進制數據處理方法詳解

    Blob、ArrayBuffer和Buffer是JavaScript中用于表示和操作二進制數據的三種主要方式,本文將深入探討這些概念,以及它們如何在JavaScript中使用,需要的可以參考一下
    2023-06-06
  • 分享JavaScript監(jiān)聽全部Ajax請求事件的方法

    分享JavaScript監(jiān)聽全部Ajax請求事件的方法

    最近在做一個小項目,引入了第三方js文件,這個文件會調用XMLHttpRequest向服務器發(fā)送 Ajax請求,但是我有需要監(jiān)聽其Ajax請求的某些事件,以便額外地執(zhí)行其他腳本。于是稍微看了看監(jiān)聽 Ajax請求的事件方法,在這里分享給大家。有需要的朋友們可以參考借鑒。
    2016-08-08

最新評論

虎林市| 犍为县| 喀喇沁旗| 兖州市| 金山区| 泰兴市| 通河县| 亚东县| 广灵县| 平邑县| 莎车县| 桑植县| 哈尔滨市| 宝丰县| 陆河县| 延安市| 天全县| 仪陇县| 衡东县| 平南县| 临高县| 青阳县| 寿宁县| 双江| 安国市| 娱乐| 巫溪县| 临桂县| 邢台县| 三穗县| 梁山县| 佛教| 班玛县| 历史| 通许县| 怀仁县| 武安市| 阳山县| 昌吉市| 馆陶县| 浏阳市|