面試題通用的柯里化封裝方法
最近跟著黃軼老師
學習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函式,只傳入半徑就能計算出面積 不管怎麼樣,是不會變的,因此我們將他寫...