0

我不明白这个递归咖喱函数是否正确。

function curry(fn) {
  return function curryInner(...args) {
    if (args.length >= fn.length) return fn(...args);
    return function (...next) {
      return curryInner(...args, ...next);
    };
  };
}

const example = {
  multiplier: 5,
  calculate: function (a, b) {
    return (a + b) * this.multiplier;
  },
};
example.curriedVersion = curry(example.calculate);

console.log(example.calculate(1, 2));
console.log(example.curriedVersion(1)(2));

我有 curry 函数实现与绑定,但我不知道为什么它工作和递归没有。你能帮我理解一下吗,我认为我在这个函数中的上下文理解是不正确的

function curry(func) {
    return function curried(...args) {

        if (args.length >= func.length) {
            return func.apply(this, args)
        } else {
            return curried.bind(this, ...args)
        }
    }
}
4

1 回答 1

1

您的curring是正确的,问题出在this.multiplier.

当您使用表达式example.calculate而不调用函数时,它不会绑定thisthis.multiplier也会如此undefined

使用example.calculate.bind(example)和你的咖喱将按预期工作。

function curry(fn) {
  return function curryInner(...args) {
    if (args.length >= fn.length) return fn(...args);
    return function (...next) {
      return curryInner(...args, ...next);
    };
  };
}

const example = {
  multiplier: 5,
  calculate: function (a, b) {
    return (a + b) * this.multiplier;
  },
};
example.curriedVersion = curry(example.calculate.bind(example));

console.log(example.calculate(1, 2));
console.log(example.curriedVersion(1)(2));

于 2022-01-26T16:36:13.777 回答