Вывести имя полученной функции
Есть функция ( не работает ):
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 не стандартно. Эх... |
Teamur, ты никогда не узнаешь имя функции, передавая ее как параметр в другую функцию... :no:
|
ksa,
А если так: function showName(f){ alert(f+''); } Возможно так получится, но не могу проверить, с планшета |
ksa,
слушай, я в регулярках вообще не шарю, как мне получить содержимое первой скобки, дс как получить параметры из строки-функции? Смотрел варианты в сети, но там какие-то длинющие регулярки для простого получения содержимого между скобками. |
Цитата:
|
Цитата:
|
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 это контекст функции, и он обычно не совпадает с самой функцией. |
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(','). Вот такие мысли. |
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=')'"} |
console.log(EmperioAf.isMaster()); // -> true Спасибо! |
Часовой пояс GMT +3, время: 06:03. |