如何编写一个既可以作为一等函数又可以作为高阶函数的 JavaScript 函数?[复制]

How to write a JavaScript function that works both as a first-class function and higher-order function? [duplicate]

提问人:Ahmad Wehbe 提问时间:9/4/2022 更新时间:9/4/2022 访问量:37

问:

例如,让我们以函数 add 为例。我希望能够调用:

add(1, 2)(3, 4)

add(1, 2)

使用相同的实现。 我尝试按以下方式编写 add 函数:

var add = (a, b) => {
    return (c, d) => {
         return a + b + c + d;
    }
}

这适用于 add(1, 2)(3, 4),但不适用于 add(1, 2)。我不确定如何在返回函数之前检查函数是否传递了参数。

JavaScript 函数 higher-order-functions first-class-functions

评论

0赞 Bergi 9/4/2022
如果希望返回一个数字,则不能像调用 中的函数一样调用该数字。add(1, 2)add(1, 2)(3, 4)

答:

0赞 Navdeesh Khurana 9/4/2022 #1

您可以将第三个参数发送到函数,并根据该参数返回函数或值。像这样的东西——add

var add = (a, b, returnType) => {
    if (returnType === 'function') {
        return (c, d) => {
            return a + b + c + d;
        }
    } else {
        return a + b;
    }
}
1赞 trincot 9/4/2022 #2

由于函数(在调用时)无法知道其返回值是否也会像函数一样被调用,因此您能做的最好的事情是让返回值可调用具有方法,以便它可以在需要数字的较大表达式中直接用作数字:valueOf

function add(...args) {
    let sum = 0;
    const f = function (...args) {
        for (const val of args) sum += val;
        return f;
    }
    f.valueOf = () => sum;
    return f(...args);
}

console.log(+add(1, 2)(3)(4, 5));

这里的“诀窍”是运算符强制其操作数强制为一个数字,这将隐式调用计算结果为 的函数对象的方法。该运算符只是调用该方法的众多方法之一。再举几个例子:+valueOfadd+valueOf

console.log("result = " + add(1, 2)(3)(4, 5));
console.log(add(1, 2)(3)(4, 5) - 0);
console.log(add(1, 2)(3)(4, 5) * 1);
console.log(Number(add(1, 2)(3)(4, 5)));