在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。 – 维基百科
函数柯里化的好处在于:
- 函数复用,提高适用性
- 延迟执行
1.函数复用:
const match = (reg, str) => {
console.log(str.match(reg));
};
const reg = /\s+/g;
// 重复调用reg变量
match(reg, 'hello world'); // [" "]
match(reg, 'spaceless'); // null
函数柯里化实现:
const curry = fn => {
return (...args) => {
return (...cb) => {
// 合并参数,立即执行
return fn.apply(null, [...args, ...cb]);
};
};
};
const match = curry((reg, str) => {
console.log(str.match(reg));
});
const hasSpace = match(/\s+/g);
hasSpace('hello world'); // [" "]
hasSpace('spaceless'); // null
缩小函数的适用范围,但同时提高函数的适用性
2.延迟执行
const curry = (fn) => {
return (...args) => {
return function _f() {
if (arguments.length) {
// 参数不为空,合并参数
args.push(...arguments);
// 返回自身,链式调用
return _f;
}
// 参数为空,立即执行
return fn.apply(null, args);
};
};
};
// 累加方法
const add = curry((...arr) => {
return arr.reduce((next, p) => {
return next + p;
}, 0);
});
console.log(add(1, 2, 3, 4)(5)()); // 15
console.log(add(1)(2)(3)(4)(5)()); // 15
累积传入参数,当不传参数的时候,最后执行。
参考地址: