
本文详解高阶函数 compose 的执行流程,揭示其返回函数如何接收并处理数据参数,帮助初学者掌握闭包与函数柯里化的关键逻辑。
本文详解高阶函数 `compose` 的执行流程,揭示其返回函数如何接收并处理数据参数,帮助初学者掌握闭包与函数柯里化的关键逻辑。
在 JavaScript 中,高阶函数(Higher-Order Function)是指接受函数作为参数、或返回函数作为结果、或两者兼具的函数。compose 就是一个典型范例——它本身不直接操作数据,而是“组装”两个函数,并返回一个可复用的新函数。
我们来看原始代码:
var humans = function(data) {
return data.filter(function(character) {
return character.species === 'human';
});
};
var images = function(data) {
return data.map(function(character) {
return character.img;
});
};
function compose(func1, func2) {
return function(data) { // ← 关键:这里定义了返回函数的参数!
return func2(func1(data));
};
}
var displayCharacterImages = compose(humans, images);
注意:compose(humans, images) 并不会立即执行 humans 或 images,而是返回一个匿名函数:
function(data) {
return images(humans(data));
}
此时,displayCharacterImages 是一个等待被调用的函数,它的形参 data 就是未来传入的实际数据源(例如一个角色数组)。只有当你显式调用它时,数据才真正“流入”:
const characters = [
{ name: 'Luke', species: 'human', img: '/luke.jpg' },
{ name: 'Chewie', species: 'wookie', img: '/chewie.jpg' },
{ name: 'Leia', species: 'human', img: '/leia.jpg' }
];
const humanImages = displayCharacterImages(characters);
// → 先过滤出 humans,再提取 img 字段 → ['/luke.jpg', '/leia.jpg']
✅ 核心要点总结:
-
compose是“函数工厂”:输入两个函数,输出一个新函数; - 返回的函数保留了对
func1和func2的引用(闭包),同时声明了自己的参数data; - 数据不是在
compose调用时传入,而是在后续调用返回函数时传入——这是函数式编程中“延迟求值”和“可组合性”的基石。
? 进阶提示:现代写法常使用箭头函数增强可读性:
const compose = (f, g) => data => g(f(data));
语义完全等价,但更简洁地凸显了“接收数据 → 执行 f → 执行 g”的数据流方向。
理解这一点,你就迈出了掌握函数式编程(如 Redux 的 compose、Lodash 的 flow、RxJS 操作符链)至关重要的第一步。










