При каких обстоятельствах контекст используется?
Я изучаю сообщение для решения проблемы дебоунтинга:
Я изо всех сил пытаюсь придумать ситуацию, в которой
func.apply(context, arguments);
Необходимо, а не просто использовать
func();
Я думаю, 99% шансов, что он будет использоваться только как функция. При каких обстоятельствах это будет прикреплено к объекту? Может кто-нибудь привести здесь пример? Спасибо.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
.