При каких обстоятельствах контекст используется?


Я изучаю сообщение для решения проблемы дебоунтинга:

Может кто-нибудь объяснить функцию "debounce" в Javascript

Я изо всех сил пытаюсь придумать ситуацию, в которой

func.apply(context, arguments);

Необходимо, а не просто использовать

func();
Я думаю, 99% шансов, что он будет использоваться только как функция. При каких обстоятельствах это будет прикреплено к объекту? Может кто-нибудь привести здесь пример? Спасибо.
2 2

2 ответа:

Здесь происходит две вещи в отношении использования 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);
     }; 
};

Во-первых, context захватывается вне обратного вызова setTimeout. Таким образом, независимо от того, какое правило привязки this используется для определения начального контекста (который зависит от того, как депонированная функция вызывается позже), оно передается через функцию обратного вызова.

С другой стороны, вы можете сделать что-то вроде:

setTimeout(function() {
  ...
  func.apply(this, args);
}.bind(this), wait);
Второе, что происходит, - это сохранение аргументов. apply здесь используется как способ передачи аргументов (опять же, важно, захваченных вне обратного вызова setTimeout), которые вы передадите исходной функции. Поскольку он принимает вызов array (в отличие от вызова ), он облегчает передачу.

Итак, если бы у вас было что-то вроде:

debouncedFunction(a, b)

Внутренний func называется соответствующим образом func(a, b).

debounce предназначен для работы с функциями, которые вызываются любым способом. Если обсуждаемая функция вызывается с контекстом или аргументами, они должны быть переданы, когда она вызывается с помощью debounce.

Поэтому, если вы обычно делаете звонок, например:

foo.method(arg1, arg2);

Тогда вы также должны уметь писать:

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

Затем, когда он вызывает метод, он получает this = foo и arguments = arg1, arg2.