[英]Calling function through Apply vs direct calling from Currying functions
我正在尝试实现柯里化 function:
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
上面给出了正确的 output,但我没有必要使用 apply。
所以,如果我将我的 function 更改为以下:
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"
我在这里基本上有两个问题:
2.如何更改我的 function,我可以如下调用它并返回总和:curry(1)(2)(3)/curry(1,2)(3)/curry(1,2, 3)等,而不是我目前打电话的方式。 我可以在 web 上找到一些解决方案,但无法理解。
前任:
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
接受三个 arguments: a
、 b
和c
。 当你这样做时:
return func(n.concat(args2));
你传递给它一个参数,一个数组。 它相当于:
const arr = n.concat(args2);
return func(arr);
听起来您想将 arguments传播到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);
我如何更改我的 function,我可以如下调用它并返回总和:curry(1)(2)(3)/curry(1,2)(3)/curry(1,2,3) ETC
跟踪在第一次调用 function 时创建的闭包中传递的 arguments 的总数。 在返回的 function 中,将所有 arguments 推入数组,如果数组长度为 3,则返回和,否则再次返回 function:
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), );
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.