# 函数柯里化

2 min read
Table of Contents

函数柯里化(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)

参考链接


More Posts