有人可以解释 JavaScript 中的 'this' in debounce 函数吗?

Can someone explain the 'this' in debounce function in JavaScript?

使用这个 debounce 函数:

function debounce(fn, delay) {
    var timer
    return function () {
      var context = this
      var args = arguments
      clearTimeout(timer)
      timer = setTimeout(function () {
        fn.apply(context, args)
      }, delay)
    }
  }

谁能解释为什么我应该只使用 fn.apply(context,args) 而不是 fn()

我知道 .apply 会更改上下文,而 var context = this 会使上下文始终与 fn() 中的上下文相同。我找不到使用 fn()fn.apply(context, args) 给出不同结果的场景。

有人能给我举个例子吗?

考虑以下 class:

class Foo {
  constructor () {
    this.a = 'a';
    this.bar = debounce(this.bar, 500);
  }

  bar () {
    console.log(this.a);
  }
}

const foo = new Foo();
foo.bar();
foo.bar();
foo.bar();

那么记录什么,什么时候记录,记录多少次?您将看到一个值被记录,一次,在最后一次调用后大约半秒。根据您发布的定义,您会看到 a。如果省略上下文部分,您将看到 undefined:

function debounceWithoutCtx(fn, delay) {
    var timer
    return function (...args) {
      clearTimeout(timer)
      timer = setTimeout(function () {
        fn(...args)
      }, delay)
    }
 }