🌰 一、什么是柯里化?
柯里化(Currying):lodash.curry 是 Lodash 库中的一个函数,用于柯里化一个函数。将一个多参数函数,转换为一系列嵌套的一元函数(只接受一个参数的函数) 。
面试中,我们需要手撕的就是
lodash.curry
示例(未柯里化):
function add(a, b, c) {
return a + b + c;
}
add(1, 2, 3); // 6
柯里化后:
add(1)(2)(3); // 6
🛠 lodash.curry使用方式
✅ 1. 安装 Lodash(如果你还没装):
npm install lodash
或者使用 ES 模块方式只引入 curry:
npm install lodash.curry
✅ 2. 使用示例
import _ from 'lodash'; // 或 const _ = require('lodash');
function add(a, b, c) {
return a + b + c;
}
const curriedAdd = _.curry(add);
// 你可以像这样一步步传参:
console.log(curriedAdd(1)(2)(3)); // 6
// 也可以一次传多个参数:
console.log(curriedAdd(1, 2)(3)); // 6
console.log(curriedAdd(1)(2, 3)); // 6
console.log(curriedAdd(1, 2, 3)); // 6
✂️ 手撕柯里化函数【lodash.curry】
我们写一个通用的 curry 工具函数,可以把任意函数柯里化:
function curry(fn){
const flength = fn.length //原参数个数
function curried(...args){
if(args.length >= flength){
return fn(...args) //参数够了,直接执行原函数
}else{
return function(...nextargs){
return curried(...args,...nextargs) //参数不够,继续收集
}
}
}
return curried
}
✅ 使用示例
function multiply(a, b, c) {
return a * b * c;
}
const curriedMultiply = curry(multiply);
console.log(curriedMultiply(2)(3)(4)); // 24
console.log(curriedMultiply(2, 3)(4)); // 24
console.log(curriedMultiply(2)(3, 4)); // 24
console.log(curriedMultiply(2, 3, 4)); // 24
💡 可以灵活地一次传多个参数或一个参数,直到传够为止再执行。
🚀 实际中适合柯里化的地方:
| 场景 | 描述 |
|---|---|
| 表单处理 | handleChange(field)(e) |
| API 封装 | apiCallWithToken(token)(endpoint)(data) |
| 权限处理 / 角色控制 | withRole('admin')(fn) |
| 状态更新(Redux/Vuex) | updateState(key)(value) |
| 统一请求处理(中间件) | withLogging(level)(handler)(req, res) |