前言
一個(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è)月的花銷            
新聞熱點(diǎn)
疑難解答
圖片精選