Объект 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.