如何在javascript中实现currying?

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

以下问题:

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中进行curring的问题。我已经实现了问题的大部分功能。棘手的一点是.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))
javascript currying first-class-functions
1个回答
2
投票

您可以通过将结果存储为函数中的属性来将.result添加到代码中。

您也可以删除冗余的tmp功能代码。外观如下:

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()在这里将克隆的函数(newSum)的第一个参数绑定为count,它将在所有后续调用中使用]

© www.soinside.com 2019 - 2024. All rights reserved.