高阶函数 是至少做以下其中一件事的函数:接收一个函数作为参数,或者返回一个函数。之所以可能是因为在 JS 中函数是 first-class values(你可以像传递任何值一样传递它们)。
接收一个函数
js
[1, 2, 3].map(n => n * 2); // map takes a function
button.addEventListener("click", handler); // so does addEventListener
setTimeout(() => doThing(), 1000);
返回一个函数(通常使用闭包)
js
function multiplier(factor) {
return n => n * factor; // returns a function that remembers `factor`
}
const double = multiplier(2);
const triple = multiplier(3);
double(5); // 10
triple(5);
这里 multiplier 从一个通用函数构建专用函数 — 闭包捕获 factor。
一个实际例子:logging 包装器
js
function withLogging(fn) {
return (...args) => {
console.log(`calling with`, args);
const result = fn(...args);
console.log(`result`, result);
return result;
};
}
const loggedAdd = ( a + b);
为什么这很重要
高阶函数使代码变得 声明式且可重用。
它们是 array 方法(map/filter/reduce)、事件处理、中间件、装饰器、currying 和 React 模式(HOCs、自定义 hooks)的基础。
与其重复编写相同的循环逻辑,不如将 行为 作为函数传递。
