高阶函数是指以函数为参数或返回函数作为结果的函数,如map、filter、reduce、debounce、once等;其核心判断标准是参数含function类型或返回值为function,与复杂度无关。

高阶函数不是“更高级的函数”,而是指以函数为参数,或返回函数作为结果的函数。这是 JavaScript 函数式编程的基础能力,不是语法糖,而是语言原生支持的特性。
什么是高阶函数:看两个关键特征
判断一个函数是不是高阶函数,只看它是否满足以下任一条件:
- 接收至少一个
function类型的参数(比如Array.prototype.map的第一个参数) - 返回值是
function(比如curry、debounce的实现)
注意:function 是 JavaScript 中的一等公民,所以能被赋值、传参、返回——这正是高阶函数存在的前提。不满足这两点的函数,哪怕写得再复杂,也不是高阶函数。
常见内置高阶函数:map、filter、reduce 都算
这些方法本身是数组原型上的方法,但它们接受回调函数作为参数,因此属于高阶函数:
立即学习“Java免费学习笔记(深入)”;
-
arr.map(callback):callback被调用时接收item、index、array,返回新数组 -
arr.filter(callback):callback返回布尔值,决定是否保留当前项 -
arr.reduce(callback, initialValue):callback接收accumulator和currentValue,逐步累积
它们的共同点是:不修改原数组、不可变、可链式调用。但容易忽略的是——如果传入的 callback 是箭头函数且用了隐式返回,要注意括号缺失导致返回 undefined(例如 arr.map(x => { x * 2 }) 实际返回 [undefined])。
手写高阶函数:debounce 和 once 最常用
这类函数不操作数据,而是“包装”另一个函数,改变其执行时机或次数:
-
debounce(fn, delay):返回一个新函数,该函数在连续触发后,只执行最后一次(常用于搜索框输入防抖) -
once(fn):返回一个新函数,确保fn只执行一次,后续调用直接返回上次结果
示例(简化版 once):
function once(fn) {
let called = false;
let result;
return function(...args) {
if (!called) {
result = fn.apply(this, args);
called = true;
}
return result;
};
}注意:once 必须保存 this 上下文和参数,否则绑定失效;debounce 则需用 clearTimeout 清除前序定时器,漏掉这步就会重复触发。
容易混淆的点:箭头函数、bind、IIFE 不是高阶函数
这些常被误认为“高阶”,但其实不符合定义:
-
const add = (a) => (b) => a + b:这个add(1)返回函数,所以add是高阶函数;但单独的箭头函数语法本身不是 -
fn.bind(obj):返回新函数,但bind是内置方法,它确实是高阶函数;不过日常说“用 bind 改变 this”时,重点不在高阶性,而在绑定行为 -
(function(){})():IIFE 是立即执行,不接收函数也不返回函数,不属于高阶函数
真正要识别高阶函数,就盯住「参数里有没有 function」或「return 后面是不是 function 表达式/声明」——其余都是干扰项。










