При каких обстоятельствах контекст используется?
Я изучаю сообщение для решения проблемы дебоунтинга:
Я изо всех сил пытаюсь придумать ситуацию, в которой
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.