我大致了解柯里化及其如何使用闭包:
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 个参数的普通函数是一样的吗?
我只是想掌握这个的用例,因为在我看来,它似乎真的很有限。
在进行部分应用或合成时很有用。例如,你可以做这样的事情
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))))
这里有几个我经常使用的现实例子。首先,在前端:
debounce(someEventHandler, someTimeout);
debounce(someOtherEventHandler, someTimeout);
debounce(yetAnotherEventHandler, someTimeout);
假设我希望所有键盘处理程序都去抖动 250 毫秒。我可以一遍又一遍地写,或者...
const debounceBy250 = curry(flip(debounce))(250);
现在代码更加简洁、清晰了。其次,在后端,假设您有从环境变量获取请求(数据库、REST、TCP 等)超时的代码。就像上面一样,您可以在每个使用它的地方添加它,也可以将它部分应用到使用它的函数中。
对于有人实际使用它但不知道它叫什么的情况,请参阅我的回答这里关于这个不完全重复的问题。
🚀 释放 JavaScript 中柯里化的力量! 🚀
您是否曾经希望拥有可以逐步执行复杂任务的功能?这就是柯里化的用武之地!想象一下,将一个采用多个参数的函数转换为一系列更小、更易于管理的函数,每个函数一次只采用一个参数。
想了解更多信息吗?查看我最新的博客,其中我用现实世界的例子来分解柯里化。 📚👇