JavaScript - 柯里化
在 JavaScript 中,Currying(柯里化) 是一种函数式编程技术,用于将一个接受多个参数的函数转换为一个每个接受单个参数的函数序列。柯里化主要用于事件处理,以及避免多次将同一个变量作为函数参数传递。
如何在 JavaScript 中实现柯里化?
在 JavaScript 中,有两种不同的方法可以实现柯里化,如下所示。
使用闭包函数
使用 bind() 方法
使用闭包进行柯里化
在 JavaScript 中,闭包是一种允许内部函数访问外部函数变量的技术。为了使用闭包技术实现柯里化,我们可以使用函数序列,每个函数接受一个参数。
语法
用户可以按照以下语法使用闭包实现柯里化。
function funcName(a) {
return function (b) {
// add more functions
// OR
return a * b;
}
}
funcName(a)(b);
在上述语法中,'funcName()' 函数接受一个参数,并且它包含内部函数。内部函数也接受一个参数,我们在内部函数的主体中使用外部函数和内部函数的参数。
上述函数的语法与以下函数类似。
function funcName(a, b) {
return a * b;
}
funcName(a, b);
让我们通过示例来理解柯里化。
示例
在下面的代码中,我们创建了 mul() 函数,它接受单个值作为参数,并返回以 'b' 为参数的函数。内部函数还返回另一个函数,该函数以 'c' 作为参数,并返回 'a'、'b' 和 'c' 的乘积。
当我们调用 mul(2) 函数时,它会返回整个内部函数,如下所示。
return function (b) {
return function (c) {
return a * b * c;
}
}
当我们调用 mul(2)(3) 函数时,
return function (c) {
return a * b * c;
}
当我们调用 mul(2)(3)(4) 时,它返回第二个内部函数的结果。
在输出中,您可以观察到该函数返回结果 24,即 3 个值的乘积。
<html>
<head>
<title>JavaScript currying using using closures</title>
</head>
<body>
<div id = "output"> </div>
<script>
// 实现柯里化
function mul(a) {
return function (b) {
return function (c) {
return a * b * c;
}
}
}
// 调用柯里化函数
let result = mul(2)(3)(4);
document.getElementById("output").innerHTML = "The result is: " + result;
</script>
</body>
</html>
输出
The result is: 24
通过这种方式,柯里化 (currying) 有助于使代码更加模块化和可重用,因为它使用了高阶函数。当需要传递与函数形参数量相等的参数才能获得准确结果时,柯里化就非常有用。例如,如果上例中没有传递 3 个参数,它将不会返回结果。
使用 bind() 方法进行柯里化
在 JavaScript 中,bind() 方法用于创建一个新函数并将其存储在变量中。bind() 通常用于将部分参数添加到函数当前参数的前面,从而有效地实现函数的柯里化。
语法
用户可以按照以下语法使用 bind() 方法在 JavaScript 中实现柯里化。
let multiplyByTwo = multiply.bind(null, 2); let multiplyByTwoAndThree = multiplyByTwo.bind(null, 3); multiplyByTwoAndThree(4); // 输出:24
在上述语法中,"multiply"可以是一个接受多个参数的函数。我们使用 bind() 方法逐个添加参数,从而实现柯里化。
示例
在下面的代码中,multiply() 函数接受 3 个参数并返回乘法结果。"multiply.bind()"将一个参数添加到 multiply() 函数,并返回更新后的函数。类似地,"multiplyByTwoAndThree()"函数存储了绑定了两个预定义参数的 multiply 函数。
当我们使用单个参数调用"multiplyByTwoAndThree()"函数时,它将返回 3 个参数相乘的结果 60。
<html>
<head>
<title>JavaScript currying using bind() method</title>
</head>
<body>
<div id = "output"> </div>
<script>
// 接受三个参数的原始乘法函数
function multiply(x, y, z) {
return x * y * z;
}
// 使用 bind() 方法通过部分应用第一个参数 (2) 实现柯里化
let multiplyByTwo = multiply.bind(null, 2);
// 通过部分应用第二个参数 (3) 进一步实现柯里化。
let multiplyByTwoAndThree = multiplyByTwo.bind(null, 3);
// 最后使用第三个参数 (10) 调用柯里化函数并输出结果
document.getElementById("output").innerHTML = "The result is: " + multiplyByTwoAndThree(10);
</script>
</body>
</html>
输出
The result is: 60
柯里化用例
柯里化技术在实时软件开发中被广泛使用,因为它可以提高代码的模块化和可重用性。这里,我们给出了一些柯里化的实时用例。
-
柯里化可用于处理异步操作,在这些操作中,函数会返回 Promise。
-
它甚至在处理需要部分应用带有特定参数的函数(这些参数可以表示事件的当前上下文)的情况时也非常有用。
-
它允许创建高度可配置的中间件函数,这些函数可以在代码的不同部分使用。

