提问人:Ahmad Wehbe 提问时间:9/4/2022 更新时间:9/4/2022 访问量:37
如何编写一个既可以作为一等函数又可以作为高阶函数的 JavaScript 函数?[复制]
How to write a JavaScript function that works both as a first-class function and higher-order function? [duplicate]
问:
例如,让我们以函数 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)。我不确定如何在返回函数之前检查函数是否传递了参数。
答:
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));
这里的“诀窍”是运算符强制其操作数强制为一个数字,这将隐式调用计算结果为 的函数对象的方法。该运算符只是调用该方法的众多方法之一。再举几个例子:+
valueOf
add
+
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)));
评论
add(1, 2)
add(1, 2)(3, 4)