摘要:定義高階函數(shù)是至少滿足下面一個條件的函數(shù)接收一個或多個函數(shù)作為參數(shù)。當然我們也可以通過高階函數(shù)來自己實現(xiàn)我們可以通過封裝高階函數(shù)來復(fù)用和簡化我們的代碼。
定義
高階函數(shù)是至少滿足下面一個條件的函數(shù):
1、接收一個或多個函數(shù)作為參數(shù)。比如filter函數(shù)
2、返回一個函數(shù)。 比如bind函數(shù)
舉個例子:比如我們要篩數(shù)組[1,2,3,4,5]中大于3的所有元素,我們通常的實現(xiàn)方法為:
let newArr = []; for(let i = 0,len = arr.length; i < len; i++){ arr[i] > 3 && newArr.push(arr[i]) }
而使用數(shù)組filter方法的話,只需要 let newArr = arr.filter((item) => {return item > 3})。當然我們也可以通過高階函數(shù)來自己實現(xiàn):
Array.prototype.myFilter = function (fn){ let newArr = []; for(let i = 0,len = this.length; i < len; i++){ fn(this[i]) && newArr.push(this[i]) } return newArr; } [1,2,3,4,5].myFilter((item) => { return item > 3})
我們可以通過封裝高階函數(shù)來復(fù)用和簡化我們的代碼。
柯里化柯里化是將一個多參數(shù)的函數(shù)轉(zhuǎn)換成多個單參數(shù)的函數(shù),這個函數(shù)會返回一個函數(shù)去處理下一個參數(shù)。也就是把fn(a,b,c)轉(zhuǎn)換為newFn(a)(b)(c)這種形象??吕锘R姷膽?yīng)用有:參數(shù)復(fù)用、延遲計算。比如我們有個拼接接口地址的函數(shù):
function getUrl(service,context,api){ return service + context + api; } let loginUrl = getUrl("http://localhost:8080/","auth","/login") let logoutUrl = getUrl("http://localhost:8080/","auth","/logout")
每次前兩個參數(shù)的值都是一樣,我們可以柯里化來封裝下來達到參數(shù)復(fù)用:
function curry(fn){ let args = Array.prototype.slice.call(arguments,1); return function(){ let innerArgs = Array.prototype.slice.call(arguments); let finalArgs = args.concat(innerArgs); if(finalArgs.length < fn.length){ //fn.length為函數(shù)的參數(shù)個數(shù) return curry.call(this,fn,...finalArgs) }else{ return fn.apply(null,finalArgs) } } } var getAuthUrl = curry(getUrl,"http://localhost:8080/","auth"); let loginUrl = getAuthUrl("/login") let logoutUrl = getAuthUrl("/logout")組合函數(shù)
組合函數(shù)類似于管道,多個函數(shù)的執(zhí)行時,上一個函數(shù)的返回值會自動傳入到第二個參數(shù)繼續(xù)執(zhí)行。比如我們替換一個url中的參數(shù):
function replaceToken(str){ return str.replace(/{token}/g,"123455") } function replaceAccount(str){ return str.replace(/{account}/g,"xuriliang") } replaceAccount(replaceToken("http://localhost/api/login?token={token}&account={account}"))
我們可以利用這種嵌套的寫法來實現(xiàn),但如果嵌套過多,代碼可讀性就不是很好了。當然我們也可以在一個函數(shù)里分過程實現(xiàn),不過這樣函數(shù)就不符合單一原則了。利用函數(shù)組合我們可以這樣寫:
function compose() { var args = arguments; var start = args.length - 1; return function() { var i = start; var result = args[start].apply(this, arguments); while (i--) result = args[i].call(this, result); return result; } } compose(replaceToken,replaceAccount)("http://localhost/api/login?token={token}&account={account}")
組合函數(shù)使得我們可以使用一些通用的函數(shù),組合出各種復(fù)雜運算。這也是函數(shù)編程中pointfree的概念。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/102594.html
摘要:歡迎您的支持系列目錄復(fù)習資料資料整理個人整理重溫基礎(chǔ)篇重溫基礎(chǔ)對象介紹重溫基礎(chǔ)對象介紹重溫基礎(chǔ)介紹重溫基礎(chǔ)相等性判斷重溫基礎(chǔ)閉包重溫基礎(chǔ)事件本章節(jié)復(fù)習的是中的高階函數(shù),可以提高我們的開發(fā)效率。 本文是 重溫基礎(chǔ) 系列文章的第二十一篇。 今日感受:想家。 本人自己整理的【Cute-JavaScript】資料,包含:【ES6/ES7/ES8/ES9】,【JavaScript基礎(chǔ)...
摘要:也可以直接調(diào)用內(nèi)置方法常用高階函數(shù)方法的作用是接收一個函數(shù)作為參數(shù),對數(shù)組中每個元素按順序調(diào)用一次傳入的函數(shù)并返回結(jié)果,不改變原數(shù)組,返回一個新數(shù)組。 Ps. 晚上加班到快十點,回來趕緊整理整理這篇文章,今天老大給我推薦了一篇文章,我從寫技術(shù)博客中收獲到了什么?- J_Knight_,感受也是很多,自己也需要慢慢養(yǎng)成記錄博客的習慣,即使起步艱難,難以堅持,但還是要讓自己加油加油。 前...
摘要:可能因為先入為主,在編程之中,往往不由自主地以的邏輯編程思路設(shè)計模式進行開發(fā)。這是原型模式很重要的一條原則。關(guān)于閉包與內(nèi)存泄露的問題,請移步原型模式閉包與高階函數(shù)應(yīng)該可以說是設(shè)計模式的基礎(chǔ)要領(lǐng)吧。在下一章,再分享一下的幾種常用設(shè)計模式。 前 在學習使用Javascript之前,我的程序猿生涯里面僅有接觸的編程語言是C#跟Java——忽略當年在大學補考了N次的C與VB。 從靜態(tài)編程語言,...
摘要:所以這里可以利用高階函數(shù)的思想來實現(xiàn)一個簡單的緩存,我可以在函數(shù)內(nèi)部用一個對象存儲輸入的參數(shù),如果下次再輸入相同的參數(shù),那就比較一下對象的屬性,把值從這個對象里面取出來。 1. 高階函數(shù) 高階函數(shù)就是那種輸入?yún)?shù)里面有一個或者多個函數(shù),輸出也是函數(shù)的函數(shù),這個在js里面主要是利用閉包實現(xiàn)的,最簡單的就是經(jīng)??吹降脑谝粋€函數(shù)內(nèi)部輸出另一個函數(shù),比如 var test = function...
閱讀 1339·2021-11-16 11:45
閱讀 2270·2021-11-02 14:40
閱讀 3915·2021-09-24 10:25
閱讀 3050·2019-08-30 12:45
閱讀 1292·2019-08-29 18:39
閱讀 2499·2019-08-29 12:32
閱讀 1651·2019-08-26 10:45
閱讀 1944·2019-08-23 17:01