假设我有一个名为multiplyDivide
如果我打电话给multiplyDivide(2)(3)(4)(6)
,则相当于2 * 3 / 4 * 6
。
更新
如果我事先不知道将要采用多少参数,是否可以编写这样的函数?例如,我可以multiplyDivide(1)(2)
或multiplyDivide(1)(2)(3)(4)...(n-1)(n)
答案 0 :(得分:9)
这有点可能,但您需要定义终止条件,因为问题与编写递归函数的问题基本相同。该函数需要一种方法来告诉天气它应该返回一个函数或一个值。
您如何表达对价值的需求取决于您。一种方法是检查参数是否通过:
textFieldA
现在你可以做到:
DocumentListener
否则它会返回一个你可以继续调用的函数:
// Using add instead of multiplyDivide to simplify example:
function add (num) {
function adder (n) {
if (n !== undefined) {
num += n;
return adder;
}
else { // terminate
return num;
}
}
return adder;
}
由于在js函数中是对象,因此您还可以将值getter实现为静态方法。它不是纯粹的功能,但使“API”更明确,更容易阅读:
var sum = add(1)(2)(3)(4)();
允许你这样做:
var x = add(1)(2)(3)(4);
x = x(5)(6)(7);
x = x(8)(9)(10);
var sum = x();
您甚至可以通过覆盖内置的function add (num) {
function adder (n) {
num += n;
return adder;
}
adder.value = function(){
return num
};
return adder;
}
和var sum = add(1)(2)(3)(4).value();
方法来获得幻想:
.valueOf()
允许你这样做:
.toString()
这里的关键是你需要一种告诉函数停止返回函数的方法。
答案 1 :(得分:3)
为什么要进行咖喱?通过提供n
参数来“重载”函数会不会更容易?
function multiplyDivide() {
var result = arguments[0];
for (var i = 1; i < arguments.length; i++) {
result = (i % 2) ? (result * arguments[i]) : (result / arguments[i]);
}
return result;
}
console.log(multiplyDivide(2, 3, 4, 6)); //9
console.log(multiplyDivide(5, 4, 2, 3, 3, 5, 1)); //50
答案 2 :(得分:0)
你的意思是这样吗?
Cupl world
答案 3 :(得分:0)
这实际上是一个非常好的问题......
Currying是函数式编程语言最基本的方面之一,您可以在其中传递函数并返回函数。 JS在某种程度上是一种函数式编程语言,应该能够执行此操作。
所以就像你问题中的那个人一样,为了这个或那个原因,人们可能想要无限期地讨论许多论证函数。
好的,让你的功能
function multiplyDivide (n,m,o,p){
return n * m / o * p;
}
然后实现实用程序curry
函数以获取任何给定函数的curried版本的方法如下:
var curry = f => f.length ? (...a) => curry(f.bind(f,...a)) : f(),
让我们看看它的实际效果
function multiplyDivide (n,m,o,p){
return n * m / o * p;
}
var curry = f => f.length ? (...a) => curry(f.bind(f,...a)) : f(),
f = curry(multiplyDivide);
res1 = f(4,5,2,10),
res2 = f(4)(5,2,10),
res3 = f(4)(5)(2,10),
res4 = f(4)(5)(2)(10),
res5 = f(4,5)(2,10),
res6 = f(4,5)(2)(10),
res7 = f(4,5,2)(10),
res8 = f(4,5)(2,10);
console.log(res1,res2,res3,res4,res5,res6,res7,res8);
可能有更简单的方法,但这是我能想到的。
答案 4 :(得分:0)
function addValues(a, b) {
if(b!=undefined)
return a + b;
return function(b) {
return a + b;
}
}
let output1 = addValues(2)(4); // 6
let output2 = addValues(2,1); // 3
console.log(output1);
console.log(output2)