0

问题如下:

create a sum function, and the requirement:

sum(1,2).result === 3
sum(1,2)(3).result == 6
sum(1,2)(3,4).result == 10
sum(1,2)(3,4)(5).result == 15

这是一个关于 JS 柯里化的问题。我已经实现了这个问题的大部分功能。棘手的一点是 .result 对我来说。

sum(1,2) 之后的 .result 是什么意思?是属性吗?

如何将 .result 添加到我的代码中?

function sum(){
    var count = 0;
    for(let i=0; i<arguments.length; i++){
        count += arguments[i];
    }
    var tmp = function(){
        for(let i=0; i<arguments.length; i++){
            count += arguments[i];
        }
        return tmp;
    }
    tmp.toString = function(){
        return count;
    }
    return tmp;
}

console.log(sum(1,2))
console.log(sum(1,2)(3))

4

4 回答 4

2

You can add .result to your code by storing result as a property in function.

You can also remove the redundant tmp function code . Here is how it looks:

function sum(){
    var count = 0;    // use previous result
    for(let i=0; i<arguments.length; i++){
        count += arguments[i];
    }
    const newSum = sum.bind(this,count);
    newSum.result = count;
    return newSum;
}

console.log(sum(1,2).result)
console.log(sum(1,2)(3).result)

.bind() here binds the first argument of cloned function (newSum) as count , which will be used on all subsequent calls

于 2019-12-10T14:39:42.433 回答
0

柯里化是一种处理函数的高级技术。它不仅用于 JavaScript,还用于其他语言。

柯里化是函数的转换,将函数从可调用的f(a, b, c)转换为可调用的f(a)(b)(c).

柯里化不调用函数。它只是改变它。

让我们先看一个例子,以便更好地理解我们在说什么,然后是实际应用。

我们将创建一个辅助函数curry(f)来执行两个参数的柯里化f。换句话说,curry(f)对于两个参数f(a, b)将其转换为运行为的函数f(a)(b)

function curry(f) { // curry(f) does the currying transform
  return function(a) {
    return function(b) {
      return f(a, b);
    };
  };
}

// usage
function sum(a, b) {
  return a + b;
}

let curriedSum = curry(sum);

alert( curriedSum(1)(2) ); // 3

另请参阅此链接以获取更多详细信息

于 2020-08-05T06:13:59.613 回答
0

这里有一个解决方案。在参数上使用扩展运算符总是比使用arguments关键字更好。应该避免女巫

function sum(...args){
    let count = 0;
    count += args.reduce((a,v) => a + v);
    let res = sum.bind(this,count);
    res.result = count;
    return res;
}

console.log(sum(1,5)(4)(5).result)

于 2020-08-05T06:21:51.917 回答
0

Shrey 的答案是完美的,但我们可以让它更清晰。

function sum() {
    let result = [...arguments].reduce((acc, num) => acc + num, 0);
    let newSum = sum.bind(this, result);
    newSum.result = result;
    return newSum;
}

console.log(sum(3,4)(5)(9).result);
console.log(sum(3,4)(5,6)(9).result);

于 2020-07-23T17:43:24.347 回答