高阶函数是接受函数为参数或返回函数的函数,体现函数作为一等值的抽象;如map/filter接收变换或判断函数,add/once返回新函数,compose/curry实现组合与柯里化。

高阶函数是指接受函数作为参数,或者返回函数作为结果的函数。它不是某种特殊语法,而是对函数使用方式的一种抽象描述——把函数当作普通值来传递和构造。
函数作为参数:回调与行为定制
当一个函数接收另一个函数作为参数时,它通常用这个函数来定义某种操作逻辑或响应时机。比如数组的 map、filter、reduce 都是典型的高阶函数:
- map([1, 2, 3], x => x * 2) → [2, 4, 6]:传入的箭头函数决定每个元素如何变换
- filter([1, 2, 3, 4], x => x % 2 === 0) → [2, 4]:传入的判断函数控制筛选条件
- setTimeout(() => console.log('done'), 1000):定时器把回调函数延迟执行
函数作为返回值:闭包与行为封装
函数返回另一个函数,常用于创建具有预设配置或私有状态的新函数。关键在于返回的函数能“记住”外层函数的变量(即闭包):
- const add = (a) => (b) => a + b;:add(5) 返回一个等待 b 的函数,调用 add(5)(3) 得到 8
- const once = (fn) => { let called = false; return (...args) => { if (!called) { called = true; return fn(...args); } }; };:生成只执行一次的函数
- 事件监听器中常返回清理函数,如 React 的 useEffect 自定义 Hook
组合与柯里化:高阶函数的实用模式
利用高阶函数可以构建更灵活、可复用的逻辑。常见手法包括函数组合(compose)和柯里化(curry):
立即学习“Java免费学习笔记(深入)”;
- const compose = (f, g) => (x) => f(g(x));:把两个函数串成一个,如 compose(toUpperCase, trim)
- const curry = (fn) => (a) => (b) => fn(a, b);:将多参数函数转为单参数链式调用
- Lodash 和 Ramda 等库大量使用这类模式,提升函数式编程表达力
注意点:避免意外的 this 和副作用
使用高阶函数时需留意上下文丢失和副作用累积问题:
- 对象方法传给高阶函数(如 arr.map(obj.method))可能丢失 this,可用 bind、箭头函数或包装处理
- 返回函数若依赖外部 mutable 变量,多次调用可能互相干扰,应确保状态隔离或显式传参
- 异步高阶函数(如 Promise.then)要明确错误传播路径,避免未捕获异常


















