Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Узнать имя функции (https://javascript.ru/forum/misc/4895-uznat-imya-funkcii.html)

ixth 27.07.2014 04:40

Цитата:

Сообщение от andypop (Сообщение 322803)
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);

MallSerg 27.07.2014 14:02

Изначально наверно имелось в виду имя метода а не имя функции. И скорее всего для того что бы иметь возможность перегрузить этот метод это вроде как зеркалированием называется т.е.
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() т.е. вернула родительский объект у которого определены все методы

melky 27.07.2014 15:15

этот метод, moveLefr, и его вызов, они отвратительны, нет?

похоже, что через все попытки сделать нормальный инструмент для анимации, ни у кого это так и не получилось ....

kobezzza 27.07.2014 15:26

Цитата:

Сообщение от melky (Сообщение 322918)
похоже, что через все попытки сделать нормальный инструмент для анимации, ни у кого это так и не получилось ....

Ну почему, мне кажется, что http://processingjs.org/learning/ сделали хороший инструмент. Никаких уродских колбеков и прочего, язык заточен под написание анимаций и интерактива.

MallSerg 27.07.2014 15:42

Цитата:

Сообщение от melky
этот метод, moveLefr, и его вызов, они отвратительны, нет?

Лично мне не нравятся цепочки callback вызовов особенно когда их больше пары десятков

Тут больше вопрос в том что довольно сложно получить имя метода из самого метода.

Единственный известный мне способ это сравнивание arguments.callee с методами объекта что выглядит довольно ужасно

melky 28.07.2014 11:19

Цитата:

Сообщение от kobezzza (Сообщение 322923)
Ну почему, мне кажется, что http://processingjs.org/learning/ сделали хороший инструмент. Никаких уродских колбеков и прочего, язык заточен под написание анимаций и интерактива.

в "интересные ссылки" кидал ссыль на язык анимации. декларативный

http://motorcortexjs.com/

и... оно тоже косячное

т.е. замешая микстуру из вышеупомянутого двига, processingjs, Web Animations можно сделать что-нибудь интересное. не без косяков, конечно :haha:

Цитата:

Сообщение от MallSerg
Лично мне не нравятся цепочки callback вызовов особенно когда их больше пары десятков

Promise ?

Pinkierar 25.12.2020 01:24

Цитата:

Сообщение от Kolyaj (Сообщение 29234)
Хотя бред какой-то, узнавать имя функции внутри нее самой.

Вот я так использую, почему это плохо?
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" получила не присвоенное значение

voraa 25.12.2020 08:02

В строгом режиме не будет работать.
В модулях


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