Javascript:柯里化的用例

问题描述 投票:0回答:3

我大致了解柯里化及其如何使用闭包:

function foo(a) {
  return function(b) {
     return function(c) {
         return a*b*c;
     }
   }
}

如何最大化这一点? 如果期望收到大量相同的参数,这不是可以节省操作时间吗?

例如,如果您知道

5
始终是第一个参数:

let first = foo(5);

然后你可以这样做:

first(8)(12);
或最后 2 个参数的其他内容。

但是,如果您不期望相同的参数,并且每次都按如下方式使用它:

foo(3)(5)(9)

这不是违背了目的吗?这与创建一个只接受 3 个参数的普通函数是一样的吗?

我只是想掌握这个的用例,因为在我看来,它似乎真的很有限。

javascript
3个回答
2
投票

在进行部分应用或合成时很有用。例如,你可以做这样的事情

const arr = [1,2,3,4]

const curry = (fn, ...a) => fn.length > a.length ? (...b) => curry(fn,...a.concat(b)) : fn.apply(null,a)

const add = curry((a,b) => a+b)

console.log(arr.map(add(5)))

const compose = (...fns) => fns.reduce((f,g) => b => f(g(b)))

console.log(arr.map(compose(add(5),add(2))))


1
投票

这里有几个我经常使用的现实例子。首先,在前端:

debounce(someEventHandler, someTimeout);
debounce(someOtherEventHandler, someTimeout);
debounce(yetAnotherEventHandler, someTimeout);

假设我希望所有键盘处理程序都去抖动 250 毫秒。我可以一遍又一遍地写,或者...

const debounceBy250 = curry(flip(debounce))(250);

现在代码更加简洁、清晰了。其次,在后端,假设您有从环境变量获取请求(数据库、REST、TCP 等)超时的代码。就像上面一样,您可以在每个使用它的地方添加它,也可以将它部分应用到使用它的函数中。

对于有人实际使用它但不知道它叫什么的情况,请参阅我的回答这里关于这个不完全重复的问题。


-2
投票

🚀 释放 JavaScript 中柯里化的力量! 🚀

您是否曾经希望拥有可以逐步执行复杂任务的功能?这就是柯里化的用武之地!想象一下,将一个采用多个参数的函数转换为一系列更小、更易于管理的函数,每个函数一次只采用一个参数。

想了解更多信息吗?查看我最新的博客,其中我用现实世界的例子来分解柯里化。 📚👇

博客(https://medium.com/@rahul.kumar0/currying-in-javascript-the-secret-sauce-of-function-programming-a55b7377d28c?sk=v2%2F1df98d01-07ae-4414-a26a-d71bd05b7114

© www.soinside.com 2019 - 2024. All rights reserved.