有没有一种方法可以用局部变量实现柯里化

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

我们需要创建一个函数来打印以下结果:

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
作为本地而不是全球。

javascript recursion currying
2个回答
1
投票

您可以将

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)());


1
投票

你可以这样做:

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());

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