You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lodash中curry与curryRight的区别:参数应用顺序是否反转?

Lodash的curry和curryRight:到底差在哪?

嘿,我来帮你把这俩的区别掰明白~你说的“参数应用顺序反转”确实是核心,但光看文字描述容易懵,结合例子看就清楚多了!

先搞懂_.curry:从左到右“填参数”

_.curry的逻辑很直观——从左到右依次接收原函数的参数,等凑够原函数需要的参数总数时,就会触发执行。

举个简单的加法例子:

const add = (a, b, c) => a + b + c;
const curriedAdd = _.curry(add);

// 不管是分多次传还是一次传部分,都是先填a,再填b,最后填c
curriedAdd(1)(2)(3); // 输出 6
curriedAdd(1, 2)(3); // 同样输出 6
curriedAdd(1)(2, 3); // 还是输出 6

再看_.curryRight:从右到左“填参数”

_.curryRight刚好反过来——从右到左填充原函数的参数,也就是先填最后一个参数,再往前推,直到参数够数才执行。

还是用刚才的add函数测试:

const curriedAddRight = _.curryRight(add);

// 第一次传的3是原函数的c,第二次传的2是b,最后传的1是a
curriedAddRight(3)(2)(1); // 输出 6
curriedAddRight(3, 2)(1); // 同样输出 6
curriedAddRight(3)(2, 1); // 依旧输出 6

实际场景里的差异

除了参数顺序反转,curryRight在某些场景下会比curry更顺手:比如原函数的最后一个参数是高频复用的回调或配置时。

举个实际点的例子,假设我们有个处理数据后执行回调的函数:

const handleData = (rawData, handler) => handler(rawData);

// 用curryRight的话,我们可以先把固定的回调绑定好
const logProcessedData = _.curryRight(handleData)((data) => {
  console.log('处理完成:', data);
});

// 后面只需要传不同的rawData就行
logProcessedData([1, 2, 3]); // 输出:处理完成: [1,2,3]
logProcessedData({ name: 'Lodash' }); // 输出:处理完成: { name: 'Lodash' }

如果用curry的话,就得先传rawData再绑回调,用起来就没这么顺畅了:

const curriedHandle = _.curry(handleData);
curriedHandle([1,2,3])((data) => console.log(data)); // 得这么写

总结一下

你对核心差异的理解完全正确:curry是从左到右依次应用参数(f(a)->f(b)->f(c)),curryRight是从右到左应用参数(f(c)->f(b)->f(a))。实际使用时,根据参数的复用频率和顺序选对应的方法就行~

内容的提问来源于stack exchange,提问作者Jul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:16:54