原函数
function add(a, b, c) { return a + b + c; } console.log(add(1, 2, 3)); // 6
偏函数
function add(a) { return function (b, c) { return a + b + c; }; } console.log(add(1)(2, 3)); // 6
柯里化
function add(a) { return function (b) { return function (c) { return a + b + c; }; }; } console.log(add(1)(2)(3)); // 6
// 偏函数 function partial(func, ...presetArgs) { return function (...args) { return func.call(this, ...presetArgs, ...args); }; } const partialAdd = partial(add, 1); console.log(partialAdd(2, 3)); // 6
// 柯里化 function curry(func, ...presetArgs) { return function (...args) { const allArgs = [...presetArgs, ...args]; if (allArgs.length >= func.length) { // 如果参数大于等于函数参数,那么允许函数提供全部参数被正常调用 return func.apply(this, allArgs); } else { // 提供参数小于函数参数,返回偏函数 return curry.call(null, func, ...allArgs); } }; } const curryAdd = curry(add); console.log(curryAdd(1)(2)(3));