我们需要创建一个函数来打印以下结果:
console.log(sum(1)(2)(3)(4)(5)(6)());
所以我就是这么做的:
let res = 0;
function sum(a){
if(a){
res = res + a;
return sum; //Return the same function for next chain of actions
}else{
return res;
}
}
console.log(sum(1)(2)(3)());
有什么办法可以通过本地
res
实现这一目标吗?我将其设置为本地时面临的问题是,它只会在下一次调用中重置。
我看到一些这样的解决方案:
function sum(a) {
return function(b){
if(!b){
return a;
}
return sum(a+b);
}
}
但我所做的方式对我来说显得更自然和直观,我只是想让
res
作为本地而不是全球。
您可以将
sum
设为 IIFE 并将 res
放入本地范围内。之后,当不带参数调用时,将 res
重置为 0
以便为下一次调用做好准备。
const sum = (() => {
let res = 0;
return function (a) {
if (typeof a === 'number') {
res = res + a;
return sum;
} else {
const temp = res;
res = 0;
return temp;
}
}
})();
console.log(sum(1)(2)(3)());
console.log(sum(1)(2)(3)(4)());
它也可以用更简单但可能被诅咒的语法来缩短:
const sum = (res => a => {
if (typeof a === 'number') {
res = res + a;
return sum;
}
try {
return res;
} finally {
res = 0;
}
})(0);
console.log(sum(1)(2)(3)());
console.log(sum(1)(2)(3)(4)());
你可以这样做:
innerSum
函数维护 res 上的闭包。这允许 res 在多次调用 innerSum
时保留其值。
function sum(a) {
let res = a;
function innerSum(b) {
if (b !== undefined) {
res += b;
return innerSum;
} else {
return res;
}
}
innerSum.toString = function() {
return res;
};
return innerSum;
}
演示
function sum(a) {
let res = a;
function innerSum(b) {
if (b !== undefined) {
res += b;
return innerSum;
} else {
return res;
}
}
innerSum.toString = function() {
return res;
};
return innerSum;
}
console.log(sum(1)(2)(3)(4)(5)(6)().toString());