@newaitix

Как получить название метода внутри метода?

"use strict";
var test={
	blabla:function(){
		// здесь узнать что этот метод называется blabla
	},
	blabla1:function(){
		// здесь узнать что этот метод называется blabla1
	}
};


Я знаю что можно просто внутри каждого метода вручную прописать.
Но мне нужно универсальное решение которое будит работать во всех методах.
Обращаю ваше внимание на то что по условию в начале стоит use strict.
  • Вопрос задан
  • 944 просмотра
Пригласить эксперта
Ответы на вопрос 3
petermzg
@petermzg
Самый лучший программист
А у вас и нет тут методов. Одни только безымянные функции.
Если переписать так:
var fn = function(){
    console.log('fn');
};
var test={
  blabla:fn,
  blabla1:fn
};

То думаю станет яснее.
Ответ написан
dummyman
@dummyman
диссидент-схизматик
Писал на вскидку, могут быть косяки, не судите строго
"use strict";
var test={
  blabla:function(){
    console.log(fullTrace()[1].funcName);
  },
  blabla1:function(){
    console.log(fullTrace()[1].funcName);
  },
  blabla2:function(){
    console.log(JSON.stringify(fullTrace(), null, 4));
  }
};

(function start(){
    test.blabla();
    test.blabla1();
    test.blabla2();
})();

function fullTrace(){
    let stack;
    try{ throw Exception() } 
    catch(e) { stack = e.stack.split(/\n/g); }
    /* exp msg */ stack.shift();
    return stack.map(s => { 
        let row = s.replace(/^\s*at\s+/,''), m;
        if(m = row.match(/([^\s\(]+) \(([^:]+):(\d+):(\d+)\)/))
            return {funcName:m[1],filePath:m[2],strNum:m[3],colNum:m[4]}
        else if(m = row.match(/([^:]+):(\d+):(\d+)/))
            return {filePath:m[1],strNum:m[2],colNum:m[3]}
    } )
}

выведет
Object.blabla
Object.blabla1
[
    {
        "funcName": "fullTrace",
        "filePath": "<anonymous>",
        "strNum": "22",
        "colNum": "10"
    },
    {
        "funcName": "Object.blabla2",
        "filePath": "<anonymous>",
        "strNum": "10",
        "colNum": "32"
    },
    {
        "funcName": "start",
        "filePath": "<anonymous>",
        "strNum": "17",
        "colNum": "10"
    },
    {
        "filePath": "<anonymous>",
        "strNum": "18",
        "colNum": "3"
    }
]
Ответ написан
Комментировать
sergiks
@sergiks Куратор тега JavaScript
♬♬
Уже никак.

Раньше можно было – свойство arguments.callee содержало название текущей функции/метода. Но в ES5 от этого отказались, и поэтому в strict mode это вызовет ошибку.

Без "use strict"; можно было бы написать в каждой функции console.log( arguments.callee);

В вашем примере этот функционал точно не нужен. Не поленитесь вместо размножения одной строки прописать имя каждой функции, или перепишите всё глобальнее, например, через перехват несуществующих методов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы