Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вызов функции с неопределенным количеством аргументов (https://javascript.ru/forum/misc/17519-vyzov-funkcii-s-neopredelennym-kolichestvom-argumentov.html)

DreamTheater 22.05.2011 18:20

Вызов функции с неопределенным количеством аргументов
 
Возникла необходимость работать с функциями, у которых не определено количество аргументов. Почитал эту статью, все весьма доступно и понятно. Как извлекать пришедшие аргументы я разобрался, и как пользоваться Array-методами в контексте arguments тоже, за что огромное спасибо автору. Однако я столкнулся с проблемой дальнейшего использования полученных значений.

Имеется следующая конструкция:

myMethod(function(a, b, c) {

  // do something

}, 'arg1', 'arg2', 'arg3');


Фактически функция myMethod() принимает в себя неопределенное количество аргументов, среди которых первый - некая анонимная функция, а все последующие являются аргументами, в нее передаваемыми. То есть должно это выглядеть так:

a = 'arg1', b = 'arg2', c = 'arg3'


Сперва я обрабатывают псевдо-массив arguments и вынимаю из него первый элемент:

var fn = Array.prototype.shift.call(arguments);


Затем пытаюсь запустить функцию:

fn(arguments);


В итоге получаю значения [object Arguments], undefined, undefined. То есть аргументы передаются в функцию как есть - в виде массива, а не набора аргументов.

Подскажите пожалуйста возможные пути решения такой задачи.

Matre 22.05.2011 18:53

fn.apply( window, Array.prototype.slice.call(arguments, 1) );

DreamTheater 22.05.2011 18:59

Цитата:

Сообщение от Matre (Сообщение 105739)
fn.apply( window, Array.prototype.slice.call(arguments, 1) );

Спасибо огромное, я и не думал что все так просто. Пытался с call сделать, а оказывается надо было с apply. А в статье писали что они ничем не отличаются :)

Matre 22.05.2011 19:13

Разница вот в чём:

func.call(context, arg1, arg2, argN);
func.apply(context, [arg1, arg2, argN]);

DreamTheater 22.05.2011 19:14

Цитата:

Сообщение от Matre (Сообщение 105743)
Разница вот в чём:

func.call(context, arg1, arg2, argN);
func.apply(context, [arg1, arg2, argN]);

Угу, я это уже понял :)

monolithed 22.05.2011 19:35

можно кстати так сократить:
(function() {
*!*
    alert([].slice.call(arguments));
*/!*
}(1,2,3));


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