0%

JS中的函数柯里化

在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。 – 维基百科

函数柯里化的好处在于:

  • 函数复用,提高适用性
  • 延迟执行

1.函数复用:

1
2
3
4
5
6
7
8
const match = (reg, str) => {
console.log(str.match(reg));
};

const reg = /\s+/g;
// 重复调用reg变量
match(reg, 'hello world'); // [" "]
match(reg, 'spaceless'); // null

函数柯里化实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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.延迟执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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

累积传入参数,当不传参数的时候,最后执行。

参考地址: