JavaScript 高阶函数
高阶函数是指接收函数作为参数或返回函数的函数,是函数式编程的基础。
概念定义
JavaScript
// 接收函数作为参数
[1, 2, 3].map(x => x * 2);
// 返回函数
function multiply(a) {
return function(b) {
return a * b;
};
}
内置高阶函数
数组方法
JavaScript
const arr = [1, 2, 3, 4, 5];
// map: 映射转换
arr.map(x => x * 2); // [2, 4, 6, 8, 10]
// filter: 过滤
arr.filter(x => x > 2); // [3, 4, 5]
// reduce: 归约
arr.reduce((sum, x) => sum + x, 0); // 15
// find: 查找
arr.find(x => x > 3); // 4
// some/every: 判断
arr.some(x => x > 4); // true
arr.every(x => x > 0); // true
sort 与回调
JavaScript
// 排序回调
[3, 1, 2].sort((a, b) => a - b); // [1, 2, 3]
// 对象排序
const users = [{age: 25}, {age: 18}];
users.sort((a, b) => a.age - b.age);
自定义高阶函数
函数作为参数
JavaScript
function executeWithLog(fn, ...args) {
console.log('执行前');
const result = fn(...args);
console.log('执行后,结果:', result);
return result;
}
executeWithLog(Math.max, 1, 2, 3); // 输出日志,返回 3
返回函数
JavaScript
// 工厂函数
function createMultiplier(factor) {
return function(number) {
return number * factor;
};
}
const double = createMultiplier(2);
double(5); // 10
柯里化
将多参数函数转换为一系列单参数函数:
JavaScript
function curry(fn) {
return function curried(...args) {
if (args.length >= fn.length) {
return fn.apply(this, args);
}
return function(...moreArgs) {
return curried.apply(this, args.concat(moreArgs));
};
};
}
function add(a, b, c) {
return a + b + c;
}
const curriedAdd = curry(add);
curriedAdd(1)(2)(3); // 6
curriedAdd(1, 2)(3); // 6
函数组合
JavaScript
// 管道组合
const pipe = (...fns) => x => fns.reduce((v, fn) => fn(v), x);
// 组合
const compose = (...fns) => x => fns.reduceRight((v, fn) => fn(v), x);
// 使用示例
const double = x => x * 2;
const addOne = x => x + 1;
const calc = pipe(double, addOne);
calc(3); // 3 * 2 + 1 = 7
高阶函数对比
| 类型 | 说明 | 示例 |
|---|---|---|
| 参数为函数 | 接收回调执行 | map, filter, reduce |
| 返回函数 | 生成新函数 | bind, 柯里化 |
| 两者兼具 | 既接收又返回 | 装饰器模式 |
要点总结
- 高阶函数接收或返回函数,实现代码复用
- 内置
map/filter/reduce是最常用的高阶函数 - 柯里化将多参数函数转为单参数函数链
- 函数组合
pipe/compose实现功能串联
📝 发现内容有误?点击此处直接编辑