Переопределение всей функции

#javascript #typescript

#javascript #typescript

Вопрос:

Я пытаюсь создать шпионскую функцию, я создаю функцию, которая принимает другую функцию и переопределяет ее. Но я получаю возможность переопределить это.

 function spy(f: (...args: any[]) => any | void) {
    const g = f;
    const metadata: IMetadata = {
        calledCount: 0,
        calledWith: []
    }

    f = function (...prototypeArgs: any[]) {
        console.log('Hello from prototype')
        metadata.calledCount  
        metadata.calledWith!.push(prototypeArgs)
        return g(...prototypeArgs)
    }
    return Object.freeze(metadata)
}
  

И я тестирую это с помощью этого

 const g = spy(f)
f()
f()
console.log(g)
  

Но g не меняется, потому что не переопределяется.

 { calledCount: 0, calledWith: [] }
  

Комментарии:

1. Поскольку вы замораживаете объект, Object.freeze(metadata) .

2. Я думаю, что это было, но потом я понимаю, что console.log внутри переназначения не вызывается

3. Да, потому что глобальная f не меняется, меняется только локальная f переменная. пожалуйста, ознакомьтесь с определением области видимости переменной JavaScript.