Как узнать кто вызвал функцию?

521
05 октября 2017, 14:49

Есть свойство caller, но в typescript почему то не получается применить https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Function/caller

Делаю как то так

export class Shoot extends State {
    shoot(point: PIXI.Point, state: string) {
        console.log(this.shoot.caller);
        this.playerComponents.network.socket.emit('touche', point);
        this.playerComponents.changeState(this.playerComponents.states[state]);
    }
}

Изначальная задача понять из какого класса был вызван метод и перейти в предыдущее состояние, для этого просто передаю строкой имя класса.

Пример того как вызывается функция

export class Move extends State {
    timer: any;
    move(input: number) {
        clearTimeout(this.timer);
        this.playerComponents.network.socket.emit('Input', input);
        this.timer = setTimeout(() => {
            this.playerComponents.changeState(this.playerComponents.states.Idle);
        }, 500);
    }
    shoot(point: PIXI.Point) {
        this.playerComponents.network.socket.emit('Input', 0);
        this.playerComponents.changeState(this.playerComponents.states.Shoot);
        this.playerComponents.state.shoot(point,'Move');
    }
}

.....
 states: any = {
        'Idle' : new Idle(this),
        'Move' : new Move(this),
        'Shoot': new Shoot(this),
        'Build': new Build(this),
    };
.....

Минимальный пример

  this.playerComponents.state.shoot(point,'Move');
Answer 1

Это работать не будет, потому что

Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them

"use strict"; 
function f() { return f.caller } 
function g() { return f() } 
g()

Правильно делать так, чтобы это не требовалось.
Возможно, стоит глянуть паттерн Шаблонный метод.

Если caller нужен для какого-то логирования, то можно попытаться распарсить стек вызовов из new Error().stack

"use strict"; 
function f() { return new Error().stack } 
function g() { return f() } 
console.log(g())

Answer 2

В общем нашел ответ оказывается если вывести в консоль arguments просто вот так вот

  shoot(point: PIXI.Point, state: string) {
        console.log(arguments);
        this.playerComponents.network.socket.emit('touche', point);
        this.playerComponents.changeState(this.playerComponents.states[state]);
    }

То все становится очевидным дальше добираемся до caller https://stackoverflow.com/questions/280389/how-do-you-find-out-the-caller-function-in-javascript

Хотя думал что будет undefined, пока не проверил

READ ALSO
Слайдер с подгрузкой фото из базы

Слайдер с подгрузкой фото из базы

Добрый деньНеобходимо реализовать слайдер с подгрузкой фото такого вида

451
Как отключить авто скролл вверх после выполнения json success?

Как отключить авто скролл вверх после выполнения json success?

Как отключить авто скролл вверх после выполнения json success ? - Проблема в href="#" - вот что вызывает скролл вверх при нажатииНужно по другому делать...

352
Добрый день, вопрос по пхп и bin2hex

Добрый день, вопрос по пхп и bin2hex

Знающие подскажите после прогонки bin2hex пробелы остаются в хексе как "20" как сделать пробелы как "00" ?

340
Php on IIS 10 windows10x64

Php on IIS 10 windows10x64

все источники показывают как развернуть php сайт на примере простого вывода информации о phpв моем сайте на php код работает не весь вот пример:...

267