JavaScript高级函数式编程核心是函数组合、柯里化与纯函数,通过compose和pipe实现函数串联,curry支持参数逐步传递,结合Maybe处理副作用,提升代码可读性与复用性。

JavaScript 中的高级函数式编程组合,核心在于将函数当作值来传递,并通过组合、柯里化、高阶函数等手段构建可复用、声明式的逻辑。重点是理解纯函数、不可变性和函数组合的思想。
使用函数组合(Function Composition)
函数组合是指将多个函数串联起来,前一个函数的输出作为下一个函数的输入。可以手动实现一个 compose 函数:
const compose = (...fns) => (value) => fns.reduceRight((acc, fn) => fn(acc), value);
// 使用示例
const toUpper = str => str.toUpperCase();
const addExclamation = str => str + '!';
const greet = str => 'Hello, ' + str;
const welcome = compose(toUpper, addExclamation, greet);
welcome('world'); // 输出: HELLO, WORLD!这种从右到左的执行顺序符合数学中的函数复合 f(g(x))。也可以实现从左到右的 pipe:
const pipe = (...fns) => (value) => fns.reduce((acc, fn) => fn(acc), value);
柯里化(Currying)提升灵活性
柯里化是把接受多个参数的函数转换为一系列使用单个参数的函数。它让函数更灵活,便于部分应用。
const curry = (fn) => {
return function curried(...args) {
if (args.length >= fn.length) {
return fn.apply(this, args);
} else {
return (...nextArgs) => curried(...args, ...nextArgs);
}
};
};
// 示例
const add = (a, b, c) => a + b + c;
const curriedAdd = curry(add);
curriedAdd(1)(2)(3); // 6
const addOne = curriedAdd(1);
addOne(2)(3); // 6结合 pipe 使用,能写出非常清晰的数据处理流程:
const processUser = pipe( curriedAdd(1), x => x * 2, Math.sqrt );
使用函子或工具库简化操作
虽然原生 JavaScript 没有内置函子,但你可以模拟 Maybe 或 Either 来处理可能失败的操作:
const Maybe = value => ({
map: fn => value == null ? Maybe(null) : Maybe(fn(value)),
getOrElse: defaultValue => value == null ? defaultValue : value
});
// 使用
Maybe('hello')
.map(s => s.toUpperCase())
.map(s => s + '!')
.getOrElse('Empty'); // "HELLO!"对于更复杂的场景,推荐使用 Ramda 或 Folktale 这类库,它们提供了成熟的函数式工具集,如自动柯里化、组合、模式匹配等。
基本上就这些。掌握 compose、curry 和不可变数据处理,就能在 JavaScript 中写出高度抽象且易于测试的函数式代码。关键是避免副作用,让函数成为可预测的“数据转换器”。
标签: JS




还木有评论哦,快来抢沙发吧~