// 普通函数柯里化
// 函数柯里化,只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数
{
// 参数固定的柯里化
function funToCurry (fn, ...args) {
return function (...argums) {
let argCom = [...args, ...argums];
if (argCom.length < fn.length) {
return funToCurry.call(null, fn, ...argCom);
} else {
return fn.apply(null, argCom);
}
}
}
function add (a, b, c, d) {
return a + b + c + d;
}
let addToCurry = funToCurry(add);
console.log(addToCurry(1)(2)(3)(4));
console.log(addToCurry(1, 2)(3)(4));
console.log(addToCurry(1)(2, 3)(4));
}
{
// 参数不固定的柯里化
function funToCurry2 (fn, ...args) {
return function (...argums) {
let argCom = [...args, ...argums];
if (argums.length !== 0) {
return funToCurry2.call(null, fn, ...argCom);
} else {
return fn.apply(null, argCom);
}
}
}
function add2 (...args) {
if (args.length === 0) {
return 'no-data';
} else {
return args.map(item => 'data-' + item);
}
}
let addToCurry = funToCurry2(add2);
console.log(addToCurry(1)(2)(3)(4)());
console.log(addToCurry(1, 2)(3)());
console.log(addToCurry(1)());
console.log(addToCurry());
}
{
// 函数反柯里化
function curryToFun(fn) {
return function (...args) {
let tempFun = fn;
for (let i = 0; i < args.length; i++) {
tempFun = tempFun.call(null, args[i]);
}
return tempFun;
}
}
function curry (a) {
return function (b) {
return function (c) {
return function (d) {
return a + b + c + d;
}
}
}
}
let curryToAdd = curryToFun(curry);
console.log(curryToAdd(1, 2, 3, 4));
console.log(curryToAdd(3, 4, 6, 7));
}
函数柯里化与反柯里化
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
相关阅读更多精彩内容
- 参考https://www.pandashen.com/2018/06/23/20180623084025/ 前言...
- 简单理解JavaScript中的柯里化和反柯里化 前言 本文旨在让大家简单理解柯里化和反柯里化,这里不做深入探究,...
- 简单理解JavaScript中的柯里化和反柯里化 前言 本文旨在让大家简单理解柯里化和反柯里化,这里不做深入探究,...