在什么情况下,我们想使用 apply 呢?

In what cases, we want to use apply with this?

我了解这是如何工作的,但无法理解为什么我们要使用带有“this”关键字的应用,如下例所示:

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

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

这里 bind 和 apply 使用“this”作为第一个参数,但是如果我们可以只做 func(args) 的目的是什么,因为 this 指向一个函数的相同词法环境。我可以通过箭头函数看到它的一些好处,但这里我命名了函数。没有区别还是我遗漏了什么?

使用apply的原因是为了保持this的值不变。调用 func(args) 将导致 this 成为 window 对象(在 non-strict 模式下)或 undefined (在严格模式下)。

这里有一个例子,如果你调用 func(args):

function curry(func) {
  return function curried(...args) {
    if (args.length >= func.length) {
      return func(args);
    } else {
      return curried.bind(this, ...args);
    }
  };
}

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

// Because of the way these are being called, `this` should be `example`
console.log(example.calculate(1, 2));
// But here it's not, causing unexpected results
console.log(example.curriedVersion(1)(2));

但如果你这样做,它会起作用 apply(this, args):

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

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

// Because of the way these are being called, `this` should be `example`
console.log(example.calculate(1, 2));
console.log(example.curriedVersion(1)(2));