【问题标题】:ES6 double arrow parameters (i.e. const update = x => y => { } ) [duplicate]ES6 双箭头参数(即 const update = x => y => { } )[重复]
【发布时间】:2017-09-22 12:53:00
【问题描述】:

以下代码中双箭头参数是什么意思?

const update = x => y => {
   // Do something with x and y
}

与以下相比有何不同?

const update = (x, y) => {
   // Do something with x and y
}

谢谢!

【问题讨论】:

  • 这些是形成柯里化函数的闭包。
  • 接受两个参数的函数与接受一个参数并返回另一个接受另一个参数的函数之间有什么区别?

标签: javascript ecmascript-6 currying


【解决方案1】:

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

来自Wikipedia

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

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

示例

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

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

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

[1, 2, 3].map(x => add(2, x));

但是,如果该函数采用柯里化形式,则无需将对 add 的调用包装在另一个箭头函数中,以使该函数适应 map 的预期。相反,您可以这样做:

const add = a => b => a + b;
[1, 2, 3].map(add(2));

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

【讨论】:

  • 通过柯里化你的抽象而不是arity,因为如果每个函数总是需要一个参数,arity 就不再重要了。
【解决方案2】:

让我们把它们改写成“旧式”,第一个是:

const update = function (x) {
  return function(y) {
    // Do something with x and y
  };
};

而第二个是:

const update = function (x, y) {
  // Do something with x and y
};

所以你可以看到它们完全不同,第一个返回一个“中间”函数,而第二个是带有两个参数的单个函数。

【讨论】:

  • 你打字太快了:P ...不错
  • 您能否解释一下我想在什么用例中使用第一个(即函数返回一个函数)?我是 Javascript 的新手。谢谢。
  • 当你想创建回调时,你会使用第一个,供以后使用,已经绑定到第一个参数(x);而您将使用第二个参数来立即使用这两个参数(xy)。
  • 另见@glennsl 答案。
【解决方案3】:

这被称为arrow functions,它是 ES6 提供的函数的新格式,在第一个示例中

const update = x => y => {
   // Do something with x and y
}

可以转为

 var update = function (x){
        return function (y){
                 // Do something with x and y..
           }
    }

在 ES5 中,并且是一个返回函数的函数 和

完全不同
const update = function (x, y) {
  // Do something with x and y
};

【讨论】:

    【解决方案4】:

    语法PARAM => EXPR 表示一个函数,它接受一个参数PARAM,其主体是{ return EXPR; }。它本身就是一个表达式,所以可以作为其他函数的EXPR

    x => y => { ... }
    

    解析为

    x => (y => { ... })
    

    相同
    x => { return y => { ... }; }
    

    【讨论】:

      猜你喜欢
      • 2016-03-25
      • 2022-01-21
      • 2021-03-29
      • 2018-08-02
      • 2018-07-18
      • 2016-04-07
      • 2018-02-11
      相关资源
      最近更新 更多