通过 Apply 调用函数与直接从 Currying 函数调用
Calling function through Apply vs direct calling from Currying functions
我正在尝试实现柯里化函数:
function sum(a, b, c) {
console.log('SUM'+JSON.stringify(arguments))
return a + b + c;
}
var curry= function (func,...n) {
return function(...args2) {
//console.log('arg2s'+args2)
return func.apply(this,n.concat(args2));
};
}
curry(sum,1,2)(3) //SUM{"0":1,"1":2,"2":3}, O/P:6
以上给出了正确的输出,但我没有必要使用 apply。
所以,如果我将函数更改为以下:
var curry= function (func,...n) {
return function(...args2) {
//console.log('arg2s'+args2)
return func(n.concat(args2));
};
}
curry(sum,1,2)(3) //SUM{"0":[1,2,3]} O/P:"1,2,3undefinedundefined"
我这里基本上有两个问题:
- 为什么直接调用func时,curry的实现不生效?为什么输出这么奇怪?
2.How 我是否以一种可以调用它的方式更改我的函数,并且应该 return 求和:
curry(1)(2)(3)/curry(1,2)(3)/curry(1,2,3) 等而不是我当前调用的方式。
网上找了一些解决办法,但是看不懂。
例如:
function curry(func) {
return function curriedFunc(...args) {
if (args.length >= func.length) {
return func.apply(this, args);
} else {
return function(...args1) {
return curriedFunc.apply(this, args.concat(args1));
}
}
};
}
任何帮助将不胜感激!!
您的 func
接受三个参数:a
、b
和 c
。当你这样做时:
return func(n.concat(args2));
您正在向它传递 一个 参数,一个数组。相当于:
const arr = n.concat(args2);
return func(arr);
听起来您想 将参数传播 到 func
的调用中:
return func(...n, ...args2)
使用扩展语法,可迭代对象中的每一项都被放入一个参数中。例如,如果 n
数组有一个项目,它被设置为传递给 func
的第一个参数,如果 args2
有两个项目,第一个被设置为传递的第二个参数,第二个设置为传递的第三个参数。
function sum(a, b, c) {
console.log('SUM' + JSON.stringify(arguments))
return a + b + c;
}
var curry = function(func, ...n) {
return function(...args2) {
return func(...n, ...args2);
};
}
curry(sum, 1, 2)(3);
How do i change my function in a way that i can call it as below and should return sum: curry(1)(2)(3)/curry(1,2)(3)/curry(1,2,3) etc
跟踪在调用函数第一次 时创建的闭包中传递的参数总数。在 returned 函数中,将所有参数压入数组,如果数组的长度为 3,则 return 求和,否则 return 再次调用函数:
function sum(a, b, c) {
return a + b + c;
}
var curry = function(func, ...argsSoFar) {
const neededArgs = func.length;
const returnedFn = (...args) => {
argsSoFar.push(...args);
if (argsSoFar.length === neededArgs) {
return func(...argsSoFar);
} else {
return returnedFn;
}
};
return returnedFn;
}
console.log(
curry(sum, 1, 2)(3),
curry(sum)(1, 2)(3),
curry(sum)(1)(2, 3),
curry(sum)(1)(2)(3),
);
我正在尝试实现柯里化函数:
function sum(a, b, c) {
console.log('SUM'+JSON.stringify(arguments))
return a + b + c;
}
var curry= function (func,...n) {
return function(...args2) {
//console.log('arg2s'+args2)
return func.apply(this,n.concat(args2));
};
}
curry(sum,1,2)(3) //SUM{"0":1,"1":2,"2":3}, O/P:6
以上给出了正确的输出,但我没有必要使用 apply。
所以,如果我将函数更改为以下:
var curry= function (func,...n) {
return function(...args2) {
//console.log('arg2s'+args2)
return func(n.concat(args2));
};
}
curry(sum,1,2)(3) //SUM{"0":[1,2,3]} O/P:"1,2,3undefinedundefined"
我这里基本上有两个问题:
- 为什么直接调用func时,curry的实现不生效?为什么输出这么奇怪?
2.How 我是否以一种可以调用它的方式更改我的函数,并且应该 return 求和: curry(1)(2)(3)/curry(1,2)(3)/curry(1,2,3) 等而不是我当前调用的方式。 网上找了一些解决办法,但是看不懂。
例如:
function curry(func) {
return function curriedFunc(...args) {
if (args.length >= func.length) {
return func.apply(this, args);
} else {
return function(...args1) {
return curriedFunc.apply(this, args.concat(args1));
}
}
};
}
任何帮助将不胜感激!!
您的 func
接受三个参数:a
、b
和 c
。当你这样做时:
return func(n.concat(args2));
您正在向它传递 一个 参数,一个数组。相当于:
const arr = n.concat(args2);
return func(arr);
听起来您想 将参数传播 到 func
的调用中:
return func(...n, ...args2)
使用扩展语法,可迭代对象中的每一项都被放入一个参数中。例如,如果 n
数组有一个项目,它被设置为传递给 func
的第一个参数,如果 args2
有两个项目,第一个被设置为传递的第二个参数,第二个设置为传递的第三个参数。
function sum(a, b, c) {
console.log('SUM' + JSON.stringify(arguments))
return a + b + c;
}
var curry = function(func, ...n) {
return function(...args2) {
return func(...n, ...args2);
};
}
curry(sum, 1, 2)(3);
How do i change my function in a way that i can call it as below and should return sum: curry(1)(2)(3)/curry(1,2)(3)/curry(1,2,3) etc
跟踪在调用函数第一次 时创建的闭包中传递的参数总数。在 returned 函数中,将所有参数压入数组,如果数组的长度为 3,则 return 求和,否则 return 再次调用函数:
function sum(a, b, c) {
return a + b + c;
}
var curry = function(func, ...argsSoFar) {
const neededArgs = func.length;
const returnedFn = (...args) => {
argsSoFar.push(...args);
if (argsSoFar.length === neededArgs) {
return func(...argsSoFar);
} else {
return returnedFn;
}
};
return returnedFn;
}
console.log(
curry(sum, 1, 2)(3),
curry(sum)(1, 2)(3),
curry(sum)(1)(2, 3),
curry(sum)(1)(2)(3),
);