在什么情况下使用上下文?

Under what circumstances does the context get used?

我正在研究post去抖动的解决方案:

Can someone explain the "debounce" function in Javascript

我正在努力想

func.apply(context, arguments);

是必要的,而不仅仅是使用

func();

我认为 99% 的可能性它只会被用作一个函数。什么情况下会附加到一个对象上?有人可以在这里举个例子吗?谢谢

debounce 旨在处理以任何方式调用的函数。如果使用上下文或参数调用被去抖动的函数,则在使用 debounce.

调用时需要传递这些函数

因此,如果您通常会拨打这样的电话:

foo.method(arg1, arg2);

那么你应该也能写:

debounced_method = debounce(foo.method);
foo.debounced_method(arg1, arg2);

然后当它调用该方法时,它会收到 this = fooarguments = arg1, arg2

关于 apply 的使用,这里发生了两件事:

function debounce(func, wait, immediate) {
    var timeout;
    return function() {
        var context = this, 
        args = arguments;
        clearTimeout(timeout);
        timeout = setTimeout(function() {
             timeout = null;
             if (!immediate) func.apply(context, args);
        }, wait);
        if (immediate && !timeout) func.apply(context, args);
     }; 
};

首先,contextsetTimeout 回调之外被捕获。因此,无论 this 绑定规则用于确定初始上下文(这取决于稍后如何调用 depounced 函数),它都会被传递给回调函数。

或者,您可以执行以下操作:

setTimeout(function() {
  ...
  func.apply(this, args);
}.bind(this), wait);

发生的第二件事是参数的保存。 apply 在这里用作传输参数的方式(同样,重要的是在 setTimeout 回调之外捕获),您将传递给原始函数。因为它需要一个 array(而不是 call),所以它很容易转移。

所以如果你有类似的东西:

debouncedFunction(a, b)

内部 func 被适当地称为 func(a, b)