国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

關(guān)于JavaScript中高階函數(shù)的魅力詳解

2024-05-06 15:30:26
字體:
供稿:網(wǎng)友

前言

一個(gè)函數(shù)就可以接收另一個(gè)函數(shù)作為參數(shù),簡言之,函數(shù)的參數(shù)能夠接收別的函數(shù),這種函數(shù)就稱之為高階函數(shù)

JavaScript 的高階函數(shù)跟 Swift 的高階函數(shù)類似

常見的高階函數(shù)有: Map、Reduce、Filter、Sort

高階函數(shù)是指至少滿足下列條件之一的函數(shù)

      1:函數(shù)可以作為參數(shù)被傳遞

      2:函數(shù)可以作為返回值輸出

JavaScript語言中的函數(shù)顯然的是滿足了高階函數(shù)的條件,下面我們一起來探尋JavaScript種高階函數(shù)的魅力。

高階函數(shù)實(shí)現(xiàn)AOP

AOP(面向切面編程)的主要作用就是把一些和核心業(yè)務(wù)邏輯模塊無關(guān)的功能抽取出來,然后再通過“動(dòng)態(tài)織入”的方式摻到業(yè)務(wù)模塊種。這些功能一般包括日志統(tǒng)計(jì),安全控制,異常處理等。AOP是Java Spring架構(gòu)的核心。下面我們就來探索一下再Javascript種如何實(shí)現(xiàn)AOP

在JavaScript種實(shí)現(xiàn)AOP,都是指把一個(gè)函數(shù)“動(dòng)態(tài)織入”到另外一個(gè)函數(shù)中,具體實(shí)現(xiàn)的技術(shù)有很多,我們使用Function.prototype來做到這一點(diǎn)。代碼如下

/*** 織入執(zhí)行前函數(shù)* @param {*} fn */Function.prototype.aopBefore = function(fn){ console.log(this) // 第一步:保存原函數(shù)的引用 const _this = this // 第四步:返回包括原函數(shù)和新函數(shù)的“代理”函數(shù) return function() { // 第二步:執(zhí)行新函數(shù),修正this fn.apply(this, arguments) // 第三步 執(zhí)行原函數(shù) return _this.apply(this, arguments) }}/*** 織入執(zhí)行后函數(shù)* @param {*} fn */Function.prototype.aopAfter = function (fn) { const _this = this return function () { let current = _this.apply(this,arguments)// 先保存原函數(shù) fn.apply(this, arguments) // 先執(zhí)行新函數(shù) return current }}/*** 使用函數(shù)*/let aopFunc = function() { console.log('aop')}// 注冊切面aopFunc = aopFunc.aopBefore(() => { console.log('aop before')}).aopAfter(() => { console.log('aop after')})// 真正調(diào)用aopFunc()

currying(柯里化)

關(guān)于curring我們首先要聊的是什么是函數(shù)柯里化。

curring又稱部分求值。一個(gè)curring的函數(shù)首先會接受一些參數(shù),接受了這些參數(shù)之后,該函數(shù)并不會立即求值,而是繼續(xù)返回另外一個(gè)函數(shù),剛才傳入的參數(shù)在函數(shù)形成的閉包中被保存起來。待到函數(shù)中被真正的需要求值的時(shí)候,之前傳入的所有參數(shù)被一次性用于求值。

生硬的看概念不太好理解,我們來看接下來的例子

我們需要一個(gè)函數(shù)來計(jì)算一年12個(gè)月的消費(fèi),在每個(gè)月月末的時(shí)候我們都要計(jì)算消費(fèi)了多少錢。正常代碼如下

// 未柯里化的函數(shù)計(jì)算開銷let totalCost = 0const cost = function(amount, mounth = '') { console.log(`第${mounth}月的花銷是${amount}`) totalCost += amount console.log(`當(dāng)前總共消費(fèi):${totalCost}`)}cost(1000, 1) // 第1個(gè)月的花銷cost(2000, 2) // 第2個(gè)月的花銷// ...cost(3000, 12) // 第12個(gè)月的花銷            
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 体育| 合川市| 铜川市| 甘肃省| 浦江县| 南召县| 丹棱县| 永年县| 青田县| 安岳县| 台东市| 延长县| 西充县| 麻阳| 兴和县| 乡城县| 肥东县| 木里| 镇原县| 浮山县| 奎屯市| 疏附县| 冷水江市| 房山区| 新巴尔虎左旗| 台中县| 余姚市| 基隆市| 古蔺县| 利辛县| 文安县| 福鼎市| 隆林| 托里县| 紫云| 宝坻区| 陕西省| 盐边县| 勃利县| 从江县| 宜章县|