通过Apply调用函数与从Currying函数直接调用

问题描述 投票:1回答:1

我正在尝试实现currying函数:

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"

我基本上在这里有两个问题:

  1. 为什么直接调用func时curry的实现不起作用?为什么输出如此奇怪?

2。如何以如下方式调用函数并返回sum:curry(1)(2)(3)/ curry(1,2)(3)/ curry(1,2,3)等,而不是我现在打电话的方式。我可以在网上找到一些解决方案,但听不懂。

ex:

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));
      }
    }
  };

}

任何帮助将不胜感激!

javascript scope currying
1个回答
1
投票

您的func接受三个参数:abc。当您这样做时:

return func(n.concat(args2));

您要传递它one参数,一个数组。等效于:

const arr = n.concat(args2);
return func(arr);

类似您想将[的声音改为func的调用:

return func(...n, ...args2)
使用传播语法,将可迭代项中的每一项都放入参数中。例如,如果n数组有一个项目,则将其设置为传递给func的第一个参数,如果args2有2个项目,则将第一个参数设置为传递的第二个参数,将第二个参数设置为第三个参数通过。

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);
我如何以如下方式调用函数并应返回总和:curry(1)(2)(3)/ curry(1,2)(3)/ curry(1,2, 3)等

跟踪在调用此函数的

first

中创建的闭包中传递的参数总数。在返回的函数中,将所有参数推入数组,如果数组的长度为3,则返回总和,否则再次返回函数:

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), );
© www.soinside.com 2019 - 2024. All rights reserved.