在閱讀react的部分源碼時,逐漸接觸了許多高階函數(shù)和多箭頭函數(shù),想把知識點(diǎn)整理一下
1.高階函數(shù)
所謂高階函數(shù),就是一個函數(shù)就可以接收另一個函數(shù)作為參數(shù),或者是返回一個函數(shù)。
例如:
javascript
var ADD =function add(a) {
return function(b) {
? return a+b
? }
? }
? 調(diào)用:ADD(2)(3)即可獲得結(jié)果
常見的高階函數(shù)有map、reduce、filter、sort等
(1) map
map接受一個函數(shù)作為參數(shù),不改變原來的數(shù)組,只是返回一個全新的數(shù)組
? var arr = [1,2,3,4,5]
? var arr1 = arr.map(item => item = 2)// 輸出[1,1,1,1,1]
?(2) reduce
reduce也是返回一個全新的數(shù)組。reduce接受一個函數(shù)作為參數(shù),這個函數(shù)要有兩個形參,代表數(shù)組中的前兩項(xiàng),reduce會將這個函數(shù)的結(jié)果與數(shù)組中的第三項(xiàng)再次組成這個函數(shù)的兩個形參以此類推進(jìn)行累積操作
? var arr = [1,2,3,4,5]
? var arr2 = arr.reduce((a,b)=> a+b)
? console.log(arr2) // 15
(3)filter
filter返回過濾后的數(shù)組。filter也接收一個函數(shù)作為參數(shù),這個函數(shù)將作用于數(shù)組中的每個元素,根據(jù)該函數(shù)每次執(zhí)行后返回的布爾值來保留結(jié)果,如果是true就保留,如果是false就過濾掉(**這點(diǎn)與map要區(qū)分**)
? var arr = [1,2,3,4,5]
? var arr3 = arr.filter(item => item % 2 == 0)
? console.log(arr3)// [2,4]
(4)sort
實(shí)現(xiàn)對數(shù)組中每項(xiàng)按照ASCII碼大小進(jìn)行排序
## ES6多箭頭函數(shù)實(shí)現(xiàn)高階函數(shù)
所謂多箭頭函數(shù)
指的是如下形式:
(a)=>(b)=>(c)=>{}
等價于
function(a) {
return function(b) {
? return function(c) {
? .....
? }
}
}
2.多箭頭函數(shù)
根據(jù)所查資料得到的結(jié)論是:多個連續(xù)箭頭函數(shù)就是 es6的多次柯里化的寫法
而所謂柯里化指的是:把接受多個參數(shù)的函數(shù)變換成接受一個單一參數(shù)的函數(shù),并且返回(接受余下的參數(shù)而且返回結(jié)果的)新函數(shù)的技術(shù)
=>n 個連續(xù)箭頭組成的函數(shù)實(shí)際上就是柯里化了 n - 1次。前 n - 1 次調(diào)用,其實(shí)是提前將參數(shù)傳遞進(jìn)去,并沒有調(diào)用最內(nèi)層函數(shù)體,最后一次調(diào)用才會調(diào)用最內(nèi)層函數(shù)體,并返回最內(nèi)層函數(shù)體的返回值。然后依次向外層函數(shù)執(zhí)行
舉例:
funcs.reduce((left, right) => (...args) => right(left(...args)));
關(guān)于柯里化的部分資料來源于:
https://www.cnblogs.com/xueandsi/p/6032578.html