Читая фрагмент TypeScript (контекст Angular), я столкнулся с озадачивающим использованием функции привязки JavaScript. Может ли кто-нибудь объяснить эту закономерность?
Пример 1
const f = this.bind('astring');
return f ? f(someArgs) : someDefaultReturn;
Шаблон в первой строке используется несколько раз здесь.
Согласно документации , использование привязки говорит о том, что она вызывается для функции и ей передается объект следующим образом:
Пример 2
const f = someFunc.bind(someObject);
Где f — это функция, которая вызывает someFunc и делает свой контекст this равным someObject при вызове f, и все это имеет смысл.
Но когда запускается код из шаблона в примере 1 вверху, someFunc («this») оказывается объектом (на самом деле это экземпляр класса, который имеет «привязку», так что да, технически это может быть функция) и someObject («строка») — это примитив, а не объект (да, я знаю, что все примитивы на самом деле обернуты объектами). Меня это совершенно сбило с толку.
Что делает этот код и как?
Спасибо, теперь я знаю, что повторное использование имен таким образом не идеально.
В первом примере вызываемый метод bind
является методом внутри класса BackendService
:
protected bind<T extends Function>(methodName: string) {
const fn = (this.inMemDbService as any)[methodName];
return fn ? (fn.bind(this.inMemDbService) as T) : undefined;
}
Как видите, этот внутренний метод bind
ищет methodName
внутри объекта inMemDbService
и связывает метод с объектом.
Спасибо. Не думал о том, чтобы войти в эту функцию во время отладки, поскольку она имела то же имя, что и собственная функция Function.prototype.bind. Так полезно сталкиваться с именами, используемыми в стандартном js — нет.
Это не тот метод привязки — github.com/angular/angular/blob/…