一文了解JS的函式柯里化

2021-10-06 00:15:27 字數 3136 閱讀 3412

面試題通用的柯里化封裝方法

最近跟著黃軼老師學習vue.js 2.5.17-beta版本原始碼時,看到了原始碼中用了函式柯里化,這裡來寫一篇,記錄一下,加深印象

// 普通的add函式

function

add(x, y)

// currying後

function

curryingadd

(x)}

console.

log(

add(1,

2))// 3

console.

log(

curryingadd(1

)(2)

)// 3

add函式接受多個引數的函式,柯里化(currying)後,變成了curryingadd函式,curryingadd函式只接受乙個單一引數,並且返回接受餘下引數同時返回結果的新函式

存在即合理,為什麼人們要用柯里化呢?

引數復用

// 正常正則驗證字串 reg.test(txt)

// 函式封裝後

function

check

(reg, txt)

check

(/\d+/g

,"hello world");

// false

check

(/[a-z]+/g

,"2020-05-11");

// false

// currying後

function

curryingcheck

(reg);}

// 字串是否有數字

var hasnumber =

curryingcheck

(/\d+/g);

// 字串是否有小寫字母

var hasletter =

curryingcheck

(/[a-z]+/g);

hasnumber

("hello world");

// false

hasnumber

("es6");

// true

hasletter

("2020-05-11");

// false

上面是乙個簡單的正則校驗,判斷有沒有包含數字,或者有沒有包括小寫字母;正常直接呼叫check函式就能滿足;但是假設有很多地方都需要校驗是否包括數字,小寫字母的話,通過柯里化,就可以把check函式第乙個引數復用起來

// 實現乙個add方法,使計算結果能夠滿足如下預期:

add(1)

(2)(

3)=6

;add(1

,2,3

)(4)

=10;add(1

)(2)

(3)(

4)(5

)=15;

function

add();

// 利用js隱式轉換的特性,當最後執行時隱式轉換,並計算最終的值返回

_adder.tostring = _adder.

valueof

=function()

;return _adder;

}add(1

)(2)

(3);

// 6 _args從[1] 變為[1, 2] 再變為[1, 2, 3] 最後自動觸發隱式轉換tostring()方法 得到陣列各項的和6

add(1,

2,3)

(4);

// 10

add(1)

(2)(

3)(4

)(5)

;// 15

add(2,

6)(1

);// 9

function

currying

(fn,

...rest1)

}

用它將乙個sayhello函式柯里化試試:

function

sayhello

(name, age, fruit),我$

歲了,我喜歡吃$`

))}const curryingshowmsg1 =

currying

(sayhello)

curryingshowmsg1

('小明',22

,'蘋果'

)// 我叫小明,我22歲了,我喜歡吃 蘋果

const curryingshowmsg2 =

currying

(sayhello,

'小愛',20

)curryingshowmsg2

('西瓜'

)// // 我叫小愛,我20歲了,我喜歡吃西瓜

加強版

function

curryinghelper

(fn, len)

}function

sayhello

(name, age, fruit)

,我 $

歲了, 我喜歡吃 $`

)}const bettershowmsg =

curryinghelper

(sayhello)

bettershowmsg

('小陽',20

,'西瓜'

)// 我叫 小陽,我 20 歲了, 我喜歡吃 西瓜

bettershowmsg

('小豬')(

25,'南瓜'

)// 我叫 小豬,我 25 歲了, 我喜歡吃 南瓜

bettershowmsg

('小明',22

)('倭瓜'

)// 我叫 小明,我 22 歲了, 我喜歡吃 倭瓜

bettershowmsg

('小愛')(

28)('冬瓜'

)// 我叫 小愛,我 28 歲了, 我喜歡吃 冬瓜

謝謝你閱讀到了最後

js函式柯里化

什麼是函式柯里化?在電腦科學中,柯里化 currying 是把接受多個引數的函式變換成接受乙個單一引數 最初函式的第乙個引數 的函式,並且返回接受餘下的引數且返回結果的新函式的技術。這個技術由 christopher strachey 以邏輯學家 haskell curry 命名的,儘管它是 mos...

js 函式柯里化

函式柯里化的主要目的就是為了減少函式傳參,同時將一些固定引數私有化。下面展示一段非常簡單計算圓面積的 來說明函式柯里化的原理 circle函式,接受半徑r和 function circle r,p 通過函式柯里化來簡化circle函式,只傳入半徑就能計算出面積 不管怎麼樣,是不會變的,因此我們將他寫...

js 函式柯里化

函式柯里化的主要目的就是為了減少函式傳參,同時將一些固定引數私有化。下面展示一段非常簡單計算圓面積的 來說明函式柯里化的原理 circle函式,接受半徑r和 function circle r,p 通過函式柯里化來簡化circle函式,只傳入半徑就能計算出面積 不管怎麼樣,是不會變的,因此我們將他寫...