ES6双箭头参数(即const update = x => y => {})

His*_*His 6 javascript currying ecmascript-6

双箭头参数在以下代码中的含义是什么?

const update = x => y => {
   // Do something with x and y
}
Run Code Online (Sandbox Code Playgroud)

与以下相比有何不同?

const update = (x, y) => {
   // Do something with x and y
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

Mat*_*ari 9

让我们把它们改成"旧式",第一个是:

const update = function (x) {
  return function(y) {
    // Do something with x and y
  };
};
Run Code Online (Sandbox Code Playgroud)

而第二个是:

const update = function (x, y) {
  // Do something with x and y
};
Run Code Online (Sandbox Code Playgroud)

因此,您可以看到它们完全不同,第一个返回"中间"函数,而第二个是具有两个参数的单个函数.


gle*_*nsl 6

“双箭头参数”没有什么特别之处,这只是一个返回另一个的箭头函数,并且可以根据需要扩展为任意数量的参数。这是一种称为“柯里化”的技术。

来自维基百科

在数学和计算机科学中,柯里化是一种将接受多个参数(或参数元组)的函数求值转换为对函数序列求值的技术,每个函数都有一个参数。

这样做的好处是可以更容易地部分应用和组合函数,这对于某些函数式编程风格很有用。

例子

假设您有一个函数add,它接受两个数字并将它们相加,您通常可以这样写:

const add = (a, b) => a + b;
Run Code Online (Sandbox Code Playgroud)

现在假设您有一个数字数组,并希望将 2 添加到所有数字中。使用map和上面的函数,你可以这样做:

[1, 2, 3].map(x => add(2, x));
Run Code Online (Sandbox Code Playgroud)

但是,如果函数是柯里化形式,则不需要将调用包装到add另一个箭头函数中,只是为了使函数适应map预期。相反,您可以这样做:

const add = a => b => a + b;
[1, 2, 3].map(add(2));
Run Code Online (Sandbox Code Playgroud)

这当然是一个微不足道且相当人为的例子,但它显示了它的本质。更容易地部分应用函数也使得编写可以组合在一起的小而灵活的函数更加实用,从而实现更加“函数式”的编程风格。