【问题标题】:ES6 arrow functions returning different valuesES6 箭头函数返回不同的值
【发布时间】:2018-04-26 22:56:44
【问题描述】:

我是 ES6 的新手,我想弄清楚这之间有什么区别:

const func1 = (x, y) => x * y * 3

还有这个:

const func2 = x => y => x * y * 3

我试过运行它,我看到func1(1,1) 返回3func2(1) 返回1

  1. 两者有什么区别和好处?
  2. 在什么情况下你会使用func2
  3. 有人可以演示您将如何使用func2吗?

【问题讨论】:

  • " func2(1) returns 1 返回 1" 那不可能。 func2 返回一个函数。 “谁能演示一下你将如何使用 func2” const mult15 = func2(5); console.log(mult15(2)).
  • @FelixKling 是 func2 使用部分应用程序吗?
  • @evolutionxbox:嗯,我会说“不”。 “部分应用”实际上意味着我只能将一些参数传递给它,而不是全部。但是,我传递了func2 期望的所有参数。但也许我很挑剔。从概念上讲是的(我猜),但实际情况并非如此。

标签: javascript ecmascript-6 arrow-functions


【解决方案1】:

const func1 = (x, y) => x * y * 3 是一个标准的箭头函数,可以转换为:

const func1 = function (x,y) {
    return x * y * 3;
}

然而,

const func2 = x => y => x * y * 3 是一个curried function,你在另一个函数中有一个函数,如下所示:

const func2 = function (x) {
    return function (y) {
       return x * y * 3;
}

是的,正如下面提到的 CRice,您必须像这样使用 func2 单独调用参数:

console.log(func2(a)(b));

相对于标准:

console.log(func1(a,b));

Currying 在实际和理论设置中都很有用。在 函数式编程语言和许多其他语言,它提供了一种方法 自动管理参数如何传递给函数和 例外。在理论计算机科学中,它提供了一种方法 在更简单的理论模型中研究具有多个参数的函数 它只提供一个参数。

所以func2 是一个可以在以下情况下使用的函数.


引用部分来自 - Wikipedia | Currying

【讨论】:

  • 这回答了我轰炸的代码审查挑战:P 真棒,终于知道答案了。
  • @Doug 哈哈甜蜜。干杯!
【解决方案2】:

函数二是函数一的curried 版本。这意味着您无需使用一对参数,而是传入第一个参数,它将返回一个新函数,您可以将第二个参数单独传递给该函数。

Curried 函数对于创建部分应用的函数非常有用。因此,对于您的示例,您可以像这样使用这些功能:

const func1 = (x, y) => x * y * 3
const func2 = x => y => x * y * 3

// Two different calling syntaxes, same result:
console.log(func1(2, 3)) // 18
console.log(func2(2)(3)) // 18, note the call chain: (2)(3).

// This is because func2 returns another function.
// You can use that function to partially apply your operation:
const times6 = func2(2);

// Then you can use that elsewhere:
console.log(times6(3)); // 18
console.log(times6(10)); // 60

【讨论】:

    猜你喜欢
    • 2017-12-04
    • 2018-04-05
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    • 2018-07-02
    相关资源
    最近更新 更多