我是ES6的新手,我正在试图找出它之间的区别:
const func1 = (x, y) => x * y * 3
和此:
const func2 = x => y => x * y * 3
我尝试过运行它,我看到func1(1,1)
返回3
而func2(1)
返回1
。
答案 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