Можно ли вызвать функцию с массивом аргументов удобным способом в JavaScript?
Пример:
var fn = function() {
console.log(arguments);
}
var args = [1,2,3];
fn(args);
Мне нужно arguments
быть [1,2,3]
, как и мой массив.
Можно ли вызвать функцию с массивом аргументов удобным способом в JavaScript?
Пример:
var fn = function() {
console.log(arguments);
}
var args = [1,2,3];
fn(args);
Мне нужно arguments
быть [1,2,3]
, как и мой массив.
Вы должны использовать 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);
};
В ECMAScript 6 вы можете использовать синтаксис распространения (...
) для этой цели. Это проще и понятнее, чем Function.prototype.apply()
.
Пример кода:
const fn = function() {
console.log(arguments);
}
const args = [1,2,3];
fn(...args);