Узнать имя функции
Возможно ли, находясь внутри функции, получить её имя?
|
конечно, писать в каждой функции, внутри которой вы можете находиться var name='имя функции';
|
arguments.callee |
В Мозилльной реализации, есть свойство .name, в остальных случаях, можно (если функция не анонимная) через .toString() + RegExp.
Цитата:
|
function test() { alert(23); } function getFnName(fn) { return fn.toString().match(/function ([^(]*)\(/)[1]; } alert(getFnName(test)); Нужно учитывать, что у функции может не быть имени. |
Цитата:
|
Мне нужно узнать именно имя
Грубо говоря function test() { alert( [некое_выражение_которое_вернёт:test] ); } |
Цитата:
|
Цитата:
судя по всему решения не существует |
function someFunction() { alert(getFnName(arguments.callee)); } Хотя бред какой-то, узнавать имя функции внутри нее самой. |
Bercut
очень трудно сопоставить между собой два сообщения, и составить общий код? Цитата:
Цитата:
|
function functionName(fun) { var ret = fun.toString(); ret = ret.substr('function '.length); ret = ret.substr(0, ret.indexOf('(')); return ret; } |
function GetRelationShips(){ var f=arguments.callee; RunEndFetch({fn:f}) } function RunEndFetch(obj){ console.log(obj.fn.name) // GetRelationShips } |
Ужасное оформление. Какие-то ни о чем не говорящие имена f, obj.
|
Цитата:
|
![]() |
Работает еще в nodejs. var f - это переменная. Она может быть любая. Функция это сигнал поэтому с большой буквы.
|
Цитата:
По названиям переменных и функций должно быть четко ясно, для чего они предназначенны. Вот как, скажи, можно понять, что делает функция "RunEndFetch(obj)"? Цитата:
|
RunEndFetch - диспатчит сигнал EndFetch и передает ему имя функции и результат фетча в объект для последующей обработки в хэндлере onEndFetch. Я пишу с большой, чтобы отличить запуск сигнала от других функций. Мне так хочется.
|
Збс как очевидно.
|
Цитата:
function FunctionNameExtractorFactoryError () { this.name = 'FunctionNameExtractorFactoryError'; } FunctionNameExtractorFactoryError.prototype = Object.create(Error.prototype); function FunctionNameExtractorFactory () { return this; } FunctionNameExtractorFactory.buildFunctionNameExtractorInstance = function () { return FunctionNameExtractorFactory.commonFunctionNameExtractor; }; FunctionNameExtractorFactory.commonFunctionNameExtractor = function (fn) { if (!fn instanceof Function) { throw new TypeError('argument \'fn\' is not instance of Function'); } if (fn.name) { return fn.name; } else { return FunctionNameExtractorFactory.fallbackFunctionNameExtractor(fn); } }; FunctionNameExtractorFactory.fallbackFunctionNameExtractor = function (fn) { if (!fn instanceof Function) { throw new TypeError('argument \'fn\' is not instance of Function'); } try { var source = (fn.toSource || fn.toString).call(fn); } catch (e) { if (e instanceof TypeError) { throw new FunctionNameExtractorFactoryError('Can\'t get function name due unknown malfunction.'); } else { throw e; } } var match = source.match(/function(?:\s+(.*?))?(?=\()/); return match ? match[1] : null; }; FunctionNameExtractorFactory.prototype.buildFunctionNameExtractorInstance = function () { return this.constructor.buildFunctionNameExtractorInstance(); }; Вызывать так: var functionNameExtractorFactory = new FunctionNameExtractorFactory(); var functionNameExtractor = functionNameExtractorFactory.buildFunctionNameExtractorInstance(); functionNameExtractor(arguments.callee); |
Изначально наверно имелось в виду имя метода а не имя функции. И скорее всего для того что бы иметь возможность перегрузить этот метод это вроде как зеркалированием называется т.е.
var Obj = {}; Obj.methodName = function functionName (){ retutn Obj } К сожалению внутри functionName() довольно сложно получить Obj.methodName А возможность перегружать методы весьма и весьма полезная штука Ну например есть желание последовательно выполнять кучу анимаций .. Обычно бля этого используют функции обратного вызова т.е. Element.moveLefr ({ speed:10; time: 1000; success : function (e){ e.moveAp ({ speed:10; time: 1000; success : function (e){ ....... //( и.т.д и.т.п ) } }) }}) Но если есть возможность перегрузить функции moveLefr и moveAp можно писать проще Element.moveLefr(10,1000).moveLefr(30,2000) // и.т.д. Для этого требуется что бы moveLefr() не выполняла анимацию а просто запомнила свое имя и правильно разместила себя в очереди анимации и вернула объект у которого есть метод moveLefr() т.е. вернула родительский объект у которого определены все методы |
этот метод, moveLefr, и его вызов, они отвратительны, нет?
похоже, что через все попытки сделать нормальный инструмент для анимации, ни у кого это так и не получилось .... |
Цитата:
|
Цитата:
Тут больше вопрос в том что довольно сложно получить имя метода из самого метода. Единственный известный мне способ это сравнивание arguments.callee с методами объекта что выглядит довольно ужасно |
Цитата:
http://motorcortexjs.com/ и... оно тоже косячное т.е. замешая микстуру из вышеупомянутого двига, processingjs, Web Animations можно сделать что-нибудь интересное. не без косяков, конечно :haha: Цитата:
|
Цитата:
let item = { value: false, setItem: function(value) { item.value = value; }, checkItem: function(funcName) { if (!item.value) console.error('Функция "%s" получила не присвоенное значение', funcName); }, add: function(value) { item.checkItem(arguments.callee.name); item.value = item.value + value; }, subtract: function(value) { item.checkItem(arguments.callee.name); item.value = item.value - value; }, clear: function() { item.checkItem(arguments.callee.name); item.value = false; }, getItem: function() { item.checkItem(arguments.callee.name); return item.value; } }; item.clear(); Функция "clear" получила не присвоенное значение |
В строгом режиме не будет работать.
В модулях |
Часовой пояс GMT +3, время: 10:24. |