Вход

Просмотр полной версии : Вызов функции с неопределенным количеством аргументов


DreamTheater
22.05.2011, 18:20
Возникла необходимость работать с функциями, у которых не определено количество аргументов. Почитал эту статью (http://javascript.ru/arguments), все весьма доступно и понятно. Как извлекать пришедшие аргументы я разобрался, и как пользоваться 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
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
Разница вот в чём:

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));