То, что вы здесь делаете, называется «декоратором». Это очень распространенная и широко используемая функция в python, но в JS после 5 лет работы они все еще находятся в очереди. Transpilers и TypeScript поддерживают декораторы, но все же невозможно декорировать функцию, только метод, поэтому вам нужно обернуть fibo
в класс, чтобы это работало (что выглядит довольно глупо, если вы спросите меня):
function trace(target, propertyKey, descriptor) {
let indent = 0;
let fn = target[propertyKey];
descriptor.value = function tracedFunction(args){
etc
}
}
class Dummy {
@trace
static fibo(num) {
if (num == 0 || num == 1)
return 1;
return Dummy.fibo(num - 1) + Dummy.fibo(num - 2);
}
}
Dummy.fibo(4)
игровая площадка Typescript
Пока синтаксис декоратора не стандартизирован и не реализован должным образом, единственный способ украсить функцию - это то, как вы ее написали - применить декоратор и переназначитьисходное имя.
Чтобы ответить на ваши вопросы, это и A, и B - функции являются первым классом в javascript, поэтому присвоение значения функции переменной связывает эту переменную с этой функцией, и старая функция теряется. Синтаксис объявления функции function foo() {...}
- это просто сокращение для var foo = function ....
(вплоть до некоторых неприятных деталей подъема).