Объект arguments
Внутри каждой функции есть переменная arguments
, которая ссылается на объект. Этот объект хранит в себе ссылки на все аргументы, с которыми была вызвана функция.
Объект создается каждый раз при вызове функции и зависит только от того какие аргументы были переданы в функцию. Объект создается даже если ни одного аргумента не было передано в функцию.
function logArguments() {
console.log(arguments);
}
logArguments(1, 2, 3); // [1, 2, 3]
logArguments('mama', 'mila', 'ramu'); // ['mama', 'mila', 'ramu']
logArguments(); // []
arguments
является массивоподобным объеком. Это означает, что он обладает некоторыми признаками массивов (числовые индексы, свойство length
), но не обладает методами массивов (forEach
, indexOf
и остальными).
function tryArgumentsMethod() {
console.log(arguments.forEach)
}
tryArgumentsMethod(); // undefined
Применение объекта arguments
Объект arguments
используется для создания функций, которые умеют обрабатывать любые количества аргументов.
Например функция, обрабатывающая любое количество аргументов (в данном случае выводит элементы в консль) будет выглядеть так:
function logEveryArgument() {
for (var i = 0; i < arguments.length; i += 1) {
console.log(arguments[i]);
}
}
logEveryArgument('mama', 'mila', 'ramu'); // 'mama', 'mila', 'ramu'
Делегирование вызова другим функциям с сохранением набора аргументов, переданных оригинальной функции.
function action(a, b, c) {
console.log('Action on', a, b, c)
}
function logEveryArgument() {
for (var i = 0; i < arguments.length; i += 1) {
console.log(arguments[i]);
}
}
function wrapWithAnotherAction(func) {
return function (a) {
console.log('Wrapped action with', a);
return func.apply(this, arguments);
}
}
var wrappedAction = wrapWithAnotherAction(action);
var wrappedLogging = wrapWithAnotherAction(logEveryArgument);
wrappedAction('uno', 'tuo', 'tre');
// Wrapped action with uno
// Action on uno tuo tre
wrappedLogging('mama');
// Wrapped action with mama
// mama
wrappedLogging('mama', 'mila', 'ramu');
// Wrapped action with mama
// mama
// mila
// ramu
Код выше демонстрирует, что какую-бы функцию не "оборачивала" функция wrapWithAnotherAction
, результирующая функция (возвращаемая из wrapWithAnotherAction
) передаст ей (оборачиваемой) все аргументы, с которыми была вызвана. Этот результат достигается с помощью использования объекта arguments
.