Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Можно ли узнать имена входящих аргументов функции? (https://javascript.ru/forum/misc/16838-mozhno-li-uznat-imena-vkhodyashhikh-argumentov-funkcii.html)

FINoM 25.04.2011 02:14

Можно ли узнать имена входящих аргументов функции?
 
Можно ли узнать, что в функцию
function(foo,bar){
   ...
}
переданы аргументы 'foo', 'bar'?

Riim 25.04.2011 03:52

PrototypeJs:
Function.prototype.argumentNames = function() {
  var names = this.toString().match(/^[\s\(]*function[^(]*\(([^)]*)\)/)[1]
    .replace(/\/\/.*?[\r\n]|\/\*(?:.|[\r\n])*?\*\//g, '')
    .replace(/\s+/g, '').split(',');
  return names.length == 1 && !names[0] ? [] : names;
};

x-yuri 28.04.2011 08:01

и что, действительно бывает нужно такое выяснять?

FINoM 29.04.2011 03:29

Цитата:

Сообщение от x-yuri
и что, действительно бывает нужно такое выяснять?

Нужно для функции определить дефолтные значения аргументов, например:
function valera(x, y, z) {
    defaultArgs(arguments, {y: 5, z: 10});
    ...
}
C методом, который предложил Riim это достаточно просто. Еще раз спасибо.

x-yuri 30.04.2011 07:43

советую подумать, почему так никто не делает... и, если будем развивать тему, приведи какой-нибудь конкретный пример

melky 30.04.2011 15:05

Цитата:

Сообщение от FINoM (Сообщение 102577)
Нужно для функции определить дефолтные значения аргументов, например:
function valera(x, y, z) {
    defaultArgs(arguments, {y: 5, z: 10});
    ...
}
C методом, который предложил Riim это достаточно просто. Еще раз спасибо.


по-моему,так проще!

function valera(x, y, z) {
    y=y || 5, z = z || 10;
    ...
   // или так
  y = typeof y === 'undefined' ? 5 : y ;
  z = typeof z === 'undefined' ? 10 : z ;
}

FINoM 30.04.2011 22:03

x-yuri, melky, так красивее.
Цитата:

Сообщение от x-yuri
почему так никто не делает

Ты всех программистов в лицо знаешь? :)

poorking 30.04.2011 23:03

FINoM,
Цитата:

Сообщение от FINoM
x-yuri, melky, так красивее.

О_О по-моему это.. эмм.. как-то не правильно... Обычно оптимизируют в сторону производительности, а вы в сторону красивости, а если функция большая, парсинг все равно какое то время будет занимать, а если функция в анимации какой нибудь вызваться будет... Так нельзя, это безумие

Тем более что вам это даст, имена переменных? ну передали вы в функцию defaultArgs ряд arguments и хэш имя>значение,
в этой функции вы будете изменять arguments, но имена-то зачем, ведь в arguments значения по Number индексу хранятся, можно как нибудь так defaultArgs(arguments, 5, 6, 7), внутри первый_аргумент[0] = arguments[1] и так до конца arguments, хотя все равно не понятно зачем это

B@rmaley.e><e 30.04.2011 23:36

Цитата:

Сообщение от poorking
ну передали вы в функцию defaultArgs ряд arguments и хэш имя>значение,
в этой функции вы будете изменять arguments, но имена-то зачем, ведь в arguments значения по Number индексу хранятся

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

poorking 30.04.2011 23:56

а почему вот так нельзя
function defaultArgs(/* arguments */){
	var len = arguments.length - 1;
	
	for(var i = 0; i < len; i ++){
		arguments[0][i] = arguments[i + 1];
	}
}
	
function valera(x, y, z){
	defaultArgs(arguments, 5,6,7);
	/* code */
}


Потому что не красиво?


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