Узнать имя функции
Возможно ли, находясь внутри функции, получить её имя?
|
конечно, писать в каждой функции, внутри которой вы можете находиться 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, время: 03:51. |