ES6箭头函数返回不同的值

时间:2018-04-26 22:56:45

标签: javascript ecmascript-6 arrow-functions

我是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吗?

2 个答案:

答案 0 :(得分:5)

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是一个功能,可用于例如你必须返回一个' abc'如果满足某些要求,则显示消息;如果未满足初始要求,则运行具有不同逻辑的新功能。

引用部分 - Wikipedia | Currying

答案 1 :(得分:0)

函数二是函数1的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