前端面试 P012:高阶函数、柯里化与部分应用
Showing the original in Chinese (China)
来源:方格前端讲面试 · 12. 高阶函数和柯里化应用场景,17 分 33 秒。
回看定位:01:16 高阶函数 · 01:48 柯里化 · 05:13 实际配置
三个概念分别是什么
- 高阶函数:接收函数作为参数,或返回函数;满足任一条件即可。
- 柯里化:把多参数函数转换成一系列单参数函数,例如 f(a, b) 变成 f(a)(b)。
- 部分应用:先固定部分参数,得到等待剩余参数的新函数;不要求每次只接收一个参数。
map、filter、reduce 是常见高阶方法;bind 也能实现部分应用,但不能直接等同于柯里化。
const add = a => b => a + b;
const add5 = add(5);
console.log(add5(3)); // 8
console.log(add(10)(7)); // 17
const atLeast = min => value => value >= min;
console.log([2, 5, 8].filter(atLeast(5))); // [5, 8]
add(5) 返回闭包,保留 a 绑定,直到提供 b 才计算。atLeast 把阈值配置与实际数据拆开,使筛选逻辑便于复用。
什么时候值得使用
当多个场景共享处理过程但处理函数不同,使用高阶函数;当同一配置会被反复使用,部分应用或柯里化可以减少重复传参。组合数据流水线时,单输入函数也容易连接。
不要为每个简单函数都增加多层调用。收益应来自复用、表达和组合,复杂的函数链可能反而难维护。高阶不代表纯:回调仍可能产生副作用,见 前端面试 P005:数组方法、可变性与回调副作用。
手写前要声明规则
固定几个参数才执行?是否支持一次传多个参数?this 取哪个阶段的调用者?如何处理默认参数、剩余参数与占位符?这些都是接口设计,不会由“高阶函数”四个字自动解决。
通用收集器见 前端面试 P018:手写柯里化与参数个数边界。本集的入门定义正确;每次收集任意多个参数的库式 curry,可以看作在经典柯里化基础上的实用扩展。