函数柯里化
2020 javascript函数柯里化(Currying)就是将函数多个参数转换成一列单个参数的函数。
例如:
x = f(a, b, c) 变成
h = g(a)
i = h(b)
x = i(c)
或者序列调用
x = f(a)(b)(c)
在 JS 简单使用
使用函数声明式
function currying(a) {
return function(b) {
console.log(a, b);
}
}
currying('a')('b');
使用函数表达式
const currying = function(a) {
return function(b) {
console.log(a, b);
}
}
currying('c')('d');
使用箭头函数
const currying = (a) => (b) => {
console.log(a, b);
}
currying('e')('f')
JS 函数柯里化
柯里化函数通常由以下步骤动态创建:调用另一个函数并为它传入要柯里化的函数和必要的参数。
function add() {
const args = Array.prototype.slice.call(arguments);
return args.reduce(function(a, b) {
return a + b;
});
}
function currying(fn) {
var args = Array.prototype.slice.call(arguments, 1);
return function() {
var innerArgs = Array.prototype.slice.call(arguments);
var finalArgs = args.concat(innerArgs);
return fn.apply(null, finalArgs);
};
}
const curryAdd = currying(add, 10);
curryAdd(1); // 11
curryAdd(2, 3); // 15
curryAdd(3); // 13
通过闭包将初步参数保存下来,然后获取剩下的参数进行拼接,最后执行需要 currying 的函数。这样在返回只扩展一个参数,不支持多参数调用,像 curryAdd(1)(2)(3)
这样的函数是无法执行的。
TODO
- 实现不定参数
curry(1)(2)(3)
参考链接
- 《JavaScript高级程序设计》 22.1.5
- JavaScript专题之函数柯里化
- 实现 add(1)(2)(3)
- JS中的柯里化(currying)