高阶函数是接受函数作为参数或返回函数作为结果的函数。JavaScript中函数是一等公民,支持赋值、传参和返回;典型应用包括数组方法(map/filter/reduce)、事件处理、异步控制及通用逻辑封装,核心在于解耦“做什么”与“何时/如何做”。

高阶函数是指**接受函数作为参数**,或**返回函数作为结果**的函数。在 JavaScript 中,函数是一等公民(first-class function),可以像字符串、数字一样被赋值、传参、返回,这为高阶函数提供了天然支持。
高阶函数的核心特征
一个函数只要满足以下任一条件,就是高阶函数:
- 接收一个或多个函数作为参数(最常见)
- 返回一个新函数(常用于闭包、柯里化、装饰器等场景)
- 同时满足以上两点(如
Array.prototype.sort接收比较函数,Promise.then返回新 Promise 函数)
以函数为参数的典型应用
这是高阶函数最直观、最常用的模式——把“行为”抽象成参数,提升代码复用性和可读性。
-
数组遍历与转换:如
map、filter、reduce都接收回调函数。例如:[1, 2, 3].map(x => x * 2)→[2, 4, 6];[1, 2, 3, 4].filter(x => x % 2 === 0)→[2, 4] -
事件处理与异步控制:如
addEventListener、setTimeout、fetch().then()都把函数当参数执行特定时机逻辑。button.addEventListener('click', () => alert('clicked')) -
封装通用逻辑:比如日志、节流、权限校验等,可抽离为高阶函数。例如简单日志包装:
function withLog(fn) { return function(...args) { console.log('calling', fn.name); return fn(...args); }; }const loggedAdd = withLog((a, b) => a + b); loggedAdd(2, 3); // 输出日志并返回 5
为什么用函数作参数?
本质是**解耦“做什么”和“何时/如何做”**:
立即学习“Java免费学习笔记(深入)”;
- 调用方决定具体行为(传入的函数),被调用方只负责流程控制(如遍历、等待、重试)
- 避免重复写相似结构(如一堆 for 循环+if 判断),让代码更声明式、更易测试
- 便于组合:多个高阶函数可嵌套使用,如
compose(f, g)(x)或链式调用arr.filter(...).map(...).sort(...)
注意点
使用时需留意:
- 传入的函数应是纯函数(无副作用、相同输入得相同输出),尤其在
map/filter中,否则结果不可预测 - 注意 this 绑定问题:箭头函数不绑定 this,普通函数在回调中可能丢失上下文,可用
bind、call或箭头函数规避 - 避免过度抽象:不是所有地方都需要高阶函数,简单逻辑直接写反而清晰


















