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
相关产品推荐
相关产品推荐

