如何在 JavaScript 中将一个函数解除 Curry 化到 n 深度?


在 JavaScript 中,如果一个函数采用一个或多个参数,并返回一个预期剩余参数的新函数,则认为该函数已“Curry 化”。Curry 化是一种强大的技术,可用于从现有函数创建新函数,或将一个函数解除 Curry 化到深度 n。

为什么我们解除函数的 Curry 化?

有几个原因可能导致你想要解除一个函数的 Curry 化。例如,你可能希望:−

  • 在预期非 Curry 化函数的环境中使用 Curry 化函数

  • 为了使其更容易阅读或调试,将 Curry 化函数转换为非 Curry 化形式

  • 优化 Curry 化函数以提高性能

如何解除函数的 Curry 化?

有两种方法可以解除一个函数的 Curry 化 −

  • 第一种方法是使用 “Function.prototype.apply” 方法。

  • 第二种方法是使用 “Function.prototype.call” 方法。

使用 “Function.prototype.apply” 方法

“Function.prototype.apply” 方法可用于解除一个函数的 Curry 化,直到深度 n。要执行此操作,你只需将 “this” 值和一个参数数组传递给 "apply" 方法即可。例如:−

<!doctype html> <html> <head> <title>Examples</title> </head> <body> <p>uncurry up to depth 2 using Function apply() method</p> <div id="result"></div> <script> function add(a, b) { return a + b; } function curriedAdd(a) { return function(b) { return a + b; } } // Uncurry the "curriedAdd" function up to depth 2: document.getElementById("result").innerHTML = curriedAdd.apply(null, [1]).apply(null, [2]); // 3 </script> </body> </html>

使用 “Function.prototype.call” 方法

“Function.prototype.call” 方法也可用于解除一个函数的 Curry 化,直到深度 n。"call" 方法类似于 "apply" 方法,但你将 "this" 值和参数作为单独的参数传递给 "call" 方法,而不是作为数组。例如:−

<!doctype html> <html> <head> <title>Examples</title> </head> <body> <p> uncurry up to depth 2 using Function call() method</p> <div id="result"></div> <script> function add(a, b) { return a + b; } function curriedAdd(a) { return function(b) { return parseInt(a) + parseInt(b); } } // Uncurry the "curriedAdd" function up to depth 2: document.getElementById("result").innerHTML = curriedAdd.call(null, [1]).call(null, [2]); // 3 </script> </body> </html>

在上面的示例中,我们使用了 “call” 方法解除 “curriedAdd” 函数的 Curry 化。如你所见,“call” 方法比 “apply” 方法稍微冗长一些,但它们具有相同的效果。

使用“Function.prototype.apply”方法有什么好处?

使用"Function.prototype.apply"方法来取消对函数的 currying 有以下几个好处 -

  • “apply”方法比“call”方法速度更快。

  • “apply”方法比“call”方法得到更广泛的支持。

  • “apply”方法比“call”方法更简洁。

总之,Currying 是一种强大的技术,可用于从现有函数创建新函数或将函数取消 currying 直到深度 n。

更新日期:2022-08-04

133 人查看

开启你的 职业生涯

完成课程并获得认证

开始
广告