ES6箭头函数本身不实现柯里化或高阶函数,而是以简洁语法支持其编写:高阶函数接收或返回函数,如multiplyBy=n=>x=>x*n;柯里化将多参函数转为单参链式调用,如add=a=>b=>c=>a+b+c;二者结合提升复用性,如pipe(...fns)=>x=>fns.reduce((v,f)=>f(v),x)。

ES6 箭头函数本身不直接“实现”柯里化或高阶函数,而是作为简洁语法,配合函数式编程思想,让柯里化和高阶函数的写法更紧凑、可读性更强。关键在于理解它们的逻辑关系:高阶函数是接受函数为参数或返回函数的函数;柯里化是把多参数函数转化为一系列单参数函数的过程;箭头函数只是帮你更轻量地定义这些函数。
用箭头函数写高阶函数
高阶函数的核心是“函数作为值”。箭头函数省略 function 关键字和大括号(单表达式时),让高阶函数定义更干净:
-
接收函数作为参数:例如
const logger = fn => (...args) => { console.log('call'); return fn(...args); };,它包装原函数并加日志。 -
返回函数:如
const multiplyBy = n => x => x * n;,调用multiplyBy(3)返回一个新函数,这就是一个天然的高阶函数。 - 注意:箭头函数没有自己的
this、arguments、super或new.target,适合纯计算场景,但不适合需要动态上下文的方法封装。
用箭头函数实现柯里化
柯里化本质是递归或迭代地“收参数”,直到参数够了才执行。箭头函数配合闭包,能写出极简的柯里化工具或手动柯里化形式:
-
手动柯里化(固定参数个数):
const add = a => b => c => a + b + c;,调用add(1)(2)(3)得到6。 -
通用柯里化函数(支持任意函数):
const curry = fn => { const curried = (...args) => args.length >= fn.length ? fn(...args) : (...more) => curried(...args, ...more); return curried; };然后const curriedMax = curry(Math.max);,可用curriedMax(1)(2)(3)或curriedMax(1, 2)(3)。 - 注意:箭头函数不能用
arguments,所以通用 curry 中必须用剩余参数...args;同时要依赖fn.length(形参个数),对含默认值或解构参数的函数可能不准确。
柯里化与高阶函数的实用组合
二者常一起用,提升复用性和可配置性。箭头函数让这种组合更直观:
立即学习“Java免费学习笔记(深入)”;
-
预设配置:
const withTimeout = ms => fn => (...args) => setTimeout(() => fn(...args), ms);,再const delayedLog = withTimeout(1000)(console.log); -
数据转换流水线:
const pipe = (...fns) => x => fns.reduce((v, f) => f(v), x);,配合箭头函数如pipe(x => x + 1, x => x * 2, x => x.toString())(3)→"8"。 - 这类组合强调“函数即数据”,箭头函数减少样板代码,让逻辑聚焦在变换本身。
不复杂但容易忽略:箭头函数只是语法糖,真正起作用的是 JavaScript 的闭包、一等函数和作用域链。掌握柯里化和高阶函数,关键是理解“函数返回函数”和“参数逐步积累”的思维,箭头函数只是让这个过程写起来更顺手。


















