Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вывести имя полученной функции (https://javascript.ru/forum/misc/69454-vyvesti-imya-poluchennojj-funkcii.html)

Teamur 24.06.2017 16:14

Вывести имя полученной функции
 
Есть функция ( не работает ):
function showName(f){
  var fName=f.name;
  alert(fName); // 'Rain'
}

function Rain(){
  showName(this); // отправим себя
}

Rain()


Дополнение
Мне кажется туповато писать имя функции и обращаться к нему:

https://developer.mozilla.org/ru/doc.../Function/name

Понимаю, если имя функции не известно и мы хотим узнать его, как в моем вопросе, а тут получается типа:

showName.name // showName
или
Тимур.имя // Тимур

Мда...

А Function.caller не стандартно. Эх...

ksa 26.06.2017 09:10

Teamur, ты никогда не узнаешь имя функции, передавая ее как параметр в другую функцию... :no:

Teamur 26.06.2017 18:06

ksa,
А если так:
function showName(f){
alert(f+'');
}

Возможно так получится, но не могу проверить, с планшета

Teamur 26.06.2017 18:13

ksa,
слушай, я в регулярках вообще не шарю, как мне получить содержимое первой скобки, дс как получить параметры из строки-функции?
Смотрел варианты в сети, но там какие-то длинющие регулярки для простого получения содержимого между скобками.

ksa 27.06.2017 08:22

Цитата:

Сообщение от Teamur (Сообщение 456576)
ksa,
А если так:
function showName(f){
alert(f+'');
}

Имя функции тут "f"...

ksa 27.06.2017 08:23

Цитата:

Сообщение от Teamur
как мне получить содержимое первой скобки, дс как получить параметры из строки-функции?

Приведи пример той строки... Потом расскажи чего из нее хочешь получить...

EmperioAf 27.06.2017 17:29

function getFunctionName(func) {
	if(typeof func === 'function') {
  	const funcNameArr = /^\s*function\s*([^\(]*).*/i.exec(func.toString());
    if(funcNameArr && funcNameArr[1]) {
    	return funcNameArr[1];
    } else {
    	return 'anonymous';
    }
  } else {
  	throw new Error('That\'s not function');
  }
}

function example(a) {
	console.log('example function', a);
}
var d = () => {};

console.log(getFunctionName(example));
console.log(getFunctionName(d));


Правда с точки зрения практики, в этом особого смысла нет. Если вы конечно не собираетесь делать всякие разные проверки на имя входящей функции. Ну и изначальная конструкция с this работать не будет. Так как this это контекст функции, и он обычно не совпадает с самой функцией.

Teamur 27.06.2017 19:04

ksa,

function showName(f){alert(f+'')};

function MyFn(a,b=1,c=7){};

showName(MyFn);


Поучил строку:
"function MyFn(a,b=1,c=7){}"

Какую надо придумать регулярку, чтобы:
1) получить всё что после первого пробела (после "function ")
2) отсечь всё что после первой закрывающей скобки
3) разбить "MyFn(a,b=1,c=7)" на две части: "MyFn" и "(a,b=1,c=7)"
4) из второй части убрать скобки, нап. так: "(a,b=1,c=7)".slice(1,-1)
5) вернуть массив ["MyFn","a,b=1,c=7"] или объект {fn:"MyFn",args:"a,b=1,c=7"}

Аргументы я потом получу через split(',').
Вот такие мысли.

EmperioAf 27.06.2017 19:58

function getFunctionName(func) {
	if(typeof func === 'function') {
  	var funcNameArr = /^\s*(?:function)?\s*([^\(]*)\s*\((.*?)\)(?:\s*\{|\s*\=\>\s*\{?).*/gmi.exec(func.toString());
    if(funcNameArr) {
    	return {
							funcName: funcNameArr[1] || 'anonymous',
							params: funcNameArr[2]
			}
    }
  } else {
  	throw new Error('That\'s not function');
  }
}

function example(a = {1:2, 2:3}, b=6, {d: d}, c) {
	console.log('example function', a);
}
var d = (c = 2, {a}) => {};
function  p(a, b=')', d = '{') { function o(){console.log('albert')}}
function MyFn(a,b=1,c=7){};
function s(a=')')
{
}

console.log(getFunctionName(example)); // {funcName: "example", params: "a = {1:2, 2:3}, b=6, {d: d}, c"}
console.log(getFunctionName(d)); // {funcName: "anonymous", params: "c = 2, {a}"}
console.log(getFunctionName(MyFn)); // {funcName: "MyFn", params: "a,b=1,c=7"}
console.log(getFunctionName(p)); // {funcName: "p", params: "a, b=')', d = '{'"}
console.log(getFunctionName(s)); // {funcName: "s", params: "a=')'"}

Teamur 27.06.2017 23:56

console.log(EmperioAf.isMaster()); // -> true

Спасибо!


Часовой пояс GMT +3, время: 10:58.