← Назад к вопросам

Как получить все аргументы у стрелочной функции?

2.0 Middle🔥 222 комментариев
#JavaScript Core

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Проблема с arguments в стрелочных функциях

Стрелочные функции (arrow functions), введённые в ES6, не имеют собственного объекта arguments. Они наследуют его из родительской области видимости. Это ключевое отличие от обычных функций.

// Обычная функция — имеет arguments
function regularFunc() {
  console.log(arguments); // Arguments { 0: 'a', 1: 'b' }
}
regularFunc('a', 'b');

// Стрелочная функция — НЕ имеет arguments
const arrowFunc = () => {
  console.log(arguments); // ReferenceError: arguments is not defined
};
arrowFunc('a', 'b');

Решение 1: Использование rest-параметров

Самый современный и рекомендуемый способ — это rest-параметры (...args). Они собирают все оставшиеся аргументы в массив:

const arrowFunc = (...args) => {
  console.log(args); // ['a', 'b', 'c']
};
arrowFunc('a', 'b', 'c');

// С混 именованных и rest-параметров
const mixedFunc = (first, second, ...rest) => {
  console.log(first);   // 'a'
  console.log(second);  // 'b'
  console.log(rest);    // ['c', 'd']
};
mixedFunc('a', 'b', 'c', 'd');

Решение 2: Обвёртка с обычной функцией

Если необходимо работать с arguments в стрелочной функции, её можно обернуть в обычную функцию, которая передаст аргументы:

const arrowFunc = (name) => {
  console.log(`Hello, ${name}`);
};

function wrapper() {
  // arguments доступен здесь
  arrowFunc.apply(this, arguments);
}

wrapper('John');

Решение 3: Использование Function.prototype.apply()

Можно передать аргументы через .apply() или .call():

const handler = (...args) => {
  console.log('Все аргументы:', args);
};

// Вызов со своим контекстом и аргументами
handler.apply(null, ['arg1', 'arg2', 'arg3']);
handler.call(null, 'arg1', 'arg2'); // аналогично

Почему так произошло

Стрелочные функции всегда наследуют контекст this и arguments из внешней области видимости. Это сделано намеренно для упрощения работы с методами массивов и избежания путаницы с контекстом:

class Logger {
  constructor(name) {
    this.name = name;
  }
  
  // Стрелочная функция сохраняет this класса
  logArgs = (...args) => {
    console.log(`${this.name}:`, args);
  }
}

const logger = new Logger('App');
logger.logArgs(1, 2, 3); // "App: [1, 2, 3]"

Рекомендация

Используй rest-параметры — это современный стандарт ES6+, более явный и функциональный, чем arguments. Код становится понятнее, и не нужно конвертировать arguments в массив через Array.from() или слайсинг.