先上代码:
- // ES5
- function curry(fn) {
- function _c(restNum, argsList) {
- return restNum === 0 ?
- fn.apply(null, argsList) :
- function(x) {
- return _c(restNum - 1, argsList.concat(x));
- };
- }
- return _c(fn.length, []);
- }
- // ES6
- const curry = fn => {
- const _c = (restNum, argsList) => restNum === 0 ?
- fn(...argsList) : x => _c(restNum - 1, [...argsList, x]);
- return _c(fn.length, []);
- }
- /***************** 应用 *********************/
- var plus = curry(function(a, b) {
- return a + b;
- });
- // ES6
- const plus = curry((a, b) => a + b);
- plus(2)(4); // => 6
如许就实现了主动的柯里化!(╭ ̄3 ̄)╭♡
如不雅你看得懂产生了什么的话,那么恭喜你!大年夜家口中的大年夜佬就是你!╰(°▽°)╯,快留下赞然后去开端你的函数式生活吧(滑稽
如不雅你没看懂产生了什么,别担心,我如今开端帮你理一下思路。
需求分析
我们须要一个 curry 函数,它接收一个待柯里化的函数为参数,返回一个用于接收一个参数的函数,接收到的参数放到一个列表中,当参数数量足够时,履行原函数并返回结不雅。
实现方法
总的设法主意就是每传一次参,就把该参数放入一个参数列表 argsList 中,如不雅已经没有要传的参数了,那么就调用fn.apply(null, argsList)
将原函数履行。要实现这点,我们就须要一个内部的断定函数 _c(restNum, argsList),函数接收两个参数,一个是残剩参数个数 restNum,另一个是已获取的参数的列表 argsList;_c 的功能就是断定是否还有未传入的参数,当 restNum 为零时,就是时刻经由过程fn.apply(null, argsList)
履行原函数并返回结不雅了。如不雅还有参数须要传递的话,也就是说 restNum 不为零时,就须要返回一个单参数函数
- function(x) {
- return _c(restNum - 1, argsList.concat(x));
- }
来持续接收参数。这里形成了一个尾递归,函数接收了一个参数后,残剩须要参数数量 restNum 减一,并将新参数 x 参加 argsList 后传入 _c 进行递归调用。结不雅就是,当参数数量不足时,返回负责接收新参数的单参数函数,当参数够了时,就调用原函数并返回。
如今再来看:
- function curry(fn) {
- function _c(restNum, argsList) {
- return restNum === 0 ?
- fn.apply(
推荐阅读
开辟者大年夜赛路演 | 12月16日,技巧立异,北京不见不散至少大年夜今朝的体验上来看,大年夜家更迎接屏下指纹而不是人脸辨认,毕竟新技巧过度须要一步步来.... 指纹辨认真的要彻底被手机摈>>>详细阅读
本文标题:JS中的柯里化及精巧的自动柯里化实现
地址:http://www.17bianji.com/lsqh/39665.html
1/2 1