柯里化
先解释下什么是 柯里化
在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。
js 里也有柯里化的实现,只是平时没有在意。先把原文简介贴出来,此文都来自于它,有兴趣的可直接访问:JavaScript 专题之函数柯里化
里面有段方法,关于柯里化函数:
// https://github.com/mqyqingfeng/Blog/issues/42#issuecomment-323919896
var curry = fn =>
(judge = (...args) =>
args.length === fn.length ? fn(...args) : arg => judge(...args, arg));
设计 es6 的一些特性,或许一下子很难理解,这里稍微写的再繁琐下:
var curry = function(fn) {
/**
* judge
* args: 柯里化函数的参数
*/
return function judge() {var args = [].slice.call(arguments);
// 柯里化定义的函数参数 == 调用该函数的参数
if (args.length >= fn.length) {return fn(...args);
} else {// 通过 ()() 形式调用 -- 柯里化
return function() {var args2 = [].slice.call(arguments);
// 拼接成新的参数,递归继续 judge
return judge.apply(null, args.concat(args2));
};
}
};
};
场景举例
参数调用来调用去,都晕了,那到底有什么用呢?
比如:实现不同幅度的相加功能
var sum = function(increment, number) {return increment + number;};
// 虽然都是相同的相加逻辑,可能在函数命名、功能定义上会有不同(当然这里只是硬性举个例子)。var addOne = sum;
var addTen = sum;
console.log(addOne(1, 5)); //6
console.log(addTen(10, 5)); //15
如果函数柯里化后:
var addOne = curry(sum)(1)(5); //6
var addTen = curry(sum)(10)(5); //15
虽然生搬硬套,不过现实业务也会有类似场景。这里能体会到 curry 带来的好处:
- 定制化。原有共性的方法,被拆成符合不同场景的业务方法
- 参数明确。由于 curry 是根据固定参数约定的,所以通过 ()() 形式固化了参数用意(比如第一个是累加数,第二个是被相加数)
再举一个简单的 Promise 实现举个例子:
function MyPromise(fn) {
// currying
this.resolveFn = function(callback) {return callback;}
this.then = function(callback) {fn(this.resolveFn(callback));
}
}
new MyPromise(function(resolve, reject) {setTimeout(function() {resolve(true)
}, 1000)
}).then(function(data) {console.log(data);
})
参考
我只是知识点的“加工者”,更多内容请查阅原文链接 ,同时感谢原作者的付出:
- 函数式编程入门教程
- JavaScript 专题之函数柯里化
- 柯里化 维基百科
关于我
如果你觉得这篇文章对你有帮助,请点个 赞或者 分享 给更多的道友。
也可以扫码关注我的 微信订阅号 – [前端雨爸 ],第一时间收到技术文章 ,工作之余我会持续输出
最后感谢阅读,你们的支持是我写作的最大动力