Подтвердить что ты не робот

Функция вызова с массивом аргументов

Можно ли вызвать функцию с массивом аргументов удобным способом в JavaScript?

Пример:

var fn = function() {
    console.log(arguments);
}

var args = [1,2,3];

fn(args);

Мне нужно arguments быть [1,2,3], как и мой массив.

4b9b3361

Ответ 1

Вы должны использовать apply:

var fn = function() {
    console.log(arguments);
};

var args = [1,2,3];

fn.apply(null, args);

Применить вызовет эквивалентную функцию:

fn(1,2,3);

Обратите внимание, что я использовал null в качестве первого аргумента apply, который установит ключевое слово this для глобального объекта (window) внутри fn.

Также вы должны знать, что объект arguments на самом деле не является массивом, это похожий на массив объект, который содержит числовые индексы, соответствующие к аргументам, которые использовались для вызова вашей функции, свойству length, которое дает вам количество используемых аргументов и свойство arguments.callee это ссылка на исполняемую функцию (полезную для рекурсии на анонимных функциях).

Если вы хотите сделать массив из вашего объекта arguments, вы можете использовать метод Array.prototype.slice:

var fn = function() {
  var args = Array.prototype.slice.call(arguments);
  console.log(args);
};

Изменить: В ответ на ваш комментарий, да, вы можете использовать метод shift и установить его возвращаемое значение в качестве контекста (ключевое слово this) для вашей функции:

fn.apply(args.shift(), args);

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

Если вам все равно нужно вызвать свою функцию со всеми вашими другими аргументами, вы можете:

fn.apply(args[0], args);

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

var fn = function() {
  var args = Array.prototype.slice.call(arguments),
      firstArg = args.shift();

  console.log(args, firstArg);
};