Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.05.2011, 17:20
Аватар для DreamTheater
Профессор
Отправить личное сообщение для DreamTheater Посмотреть профиль Найти все сообщения от DreamTheater
 
Регистрация: 15.02.2011
Сообщений: 471

Вызов функции с неопределенным количеством аргументов
Возникла необходимость работать с функциями, у которых не определено количество аргументов. Почитал эту статью, все весьма доступно и понятно. Как извлекать пришедшие аргументы я разобрался, и как пользоваться 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. То есть аргументы передаются в функцию как есть - в виде массива, а не набора аргументов.

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

Последний раз редактировалось DreamTheater, 22.05.2011 в 17:34.
Ответить с цитированием
  #2 (permalink)  
Старый 22.05.2011, 17:53
Профессор
Отправить личное сообщение для Matre Посмотреть профиль Найти все сообщения от Matre
 
Регистрация: 07.01.2011
Сообщений: 582

fn.apply( window, Array.prototype.slice.call(arguments, 1) );
Ответить с цитированием
  #3 (permalink)  
Старый 22.05.2011, 17:59
Аватар для DreamTheater
Профессор
Отправить личное сообщение для DreamTheater Посмотреть профиль Найти все сообщения от DreamTheater
 
Регистрация: 15.02.2011
Сообщений: 471

Сообщение от Matre Посмотреть сообщение
fn.apply( window, Array.prototype.slice.call(arguments, 1) );
Спасибо огромное, я и не думал что все так просто. Пытался с call сделать, а оказывается надо было с apply. А в статье писали что они ничем не отличаются
Ответить с цитированием
  #4 (permalink)  
Старый 22.05.2011, 18:13
Профессор
Отправить личное сообщение для Matre Посмотреть профиль Найти все сообщения от Matre
 
Регистрация: 07.01.2011
Сообщений: 582

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

func.call(context, arg1, arg2, argN);
func.apply(context, [arg1, arg2, argN]);
Ответить с цитированием
  #5 (permalink)  
Старый 22.05.2011, 18:14
Аватар для DreamTheater
Профессор
Отправить личное сообщение для DreamTheater Посмотреть профиль Найти все сообщения от DreamTheater
 
Регистрация: 15.02.2011
Сообщений: 471

Сообщение от Matre Посмотреть сообщение
Разница вот в чём:

func.call(context, arg1, arg2, argN);
func.apply(context, [arg1, arg2, argN]);
Угу, я это уже понял
Ответить с цитированием
  #6 (permalink)  
Старый 22.05.2011, 18:35
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызов функции TicTac Общие вопросы Javascript 2 24.01.2011 22:35
Вызов функции, находящейся в другой функции ZneP Events/DOM/Window 6 24.08.2010 17:45
непонятный вызов функции hedgi Общие вопросы Javascript 2 05.08.2010 10:55
вызов функции из функции sharp_007 Общие вопросы Javascript 2 03.04.2010 20:13
Вызов функции из другой функции.. ?? glutton Общие вопросы Javascript 3 21.08.2009 21:33