curring: 柯里化函数
- 一种预先存储的思想,也是闭包的进阶运用,利用闭包的保存作用
例子1
const fn = (...params) =>
(args) => params.concat(args).reduce((res, item) => res + item);
let res = fn(1, 2)(3);
console.log(res);
例子2
const curring = () => {
let params = [];
const add = (...arg) => {
params = params.concat(arg);
return add;
}
add[Symbol.toPrimitive] = () => params.reduce((res, item) => res + item);
return add;
}
let add = curring();
res = add(1)(2)(3);
console.log(+res);
add = curring();
res = add(1, 2, 3)(4);
console.log(+res);
add = curring();
res = add(1)(2)(3)(4)(5);
console.log(+res);
例子3
const add1 = x => x + 1;
const mul3 = x => x * 3;
const div2 = x => x / 2;
const compose = (...funcs) => {
let len = funcs.length;
if(len === 0) {
return x => x
}
if(len === 1) {
return funcs[0];
}
return (x) => {
return funcs.reduceRight((x, fn) => {
return fn(x);
}, x)
}
}
const operate = compose(div2, mul3, add1, add1);
console.log(operate(0));
console.log(operate(2));
function compose(...funcs) {
let len = funcs.length;
if (len === 0) return x => x;
if (len === 1) return funcs[0];
return funcs.reduce((a, b) => {
return (...args) => {
return a(b(...args));
}
})
}