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

Можно ли в стрелочной функции обратиться к псевдомассиву arguments?

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

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

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

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

Стрелочные функции и arguments

Краткий ответ: НЕТ, в стрелочной функции нельзя обратиться к arguments. Это один из ключевых различий между стрелочными функциями и обычными функциями.

Почему arguments недоступен

arguments — это псевдомассив, который содержит все переданные в функцию аргументы. Но стрелочные функции не имеют собственного arguments.

// Обычная функция
function regularFunc() {
  console.log(arguments);  // [1, 2, 3]
}
regularFunc(1, 2, 3);

// Стрелочная функция
const arrowFunc = () => {
  console.log(arguments);  // ReferenceError: arguments is not defined
};
arrowFunc(1, 2, 3);

Причина: контекст this

Стрелочные функции были разработаны для решения проблем с контекстом this. Как часть этого, они также не создают собственный объект arguments.

Стрелочная функция наследует arguments из внешней функции:

function outer() {
  console.log("Outer arguments:", arguments);  // [1]

  const arrow = () => {
    // Используем arguments из outer функции
    console.log("Arrow arguments:", arguments);  // [1]
  };

  arrow(2, 3);  // arguments arrow берет из outer
}

outer(1);

Решение 1: Rest параметры (...args)

Это современный и рекомендуемый способ:

// Плохо: старый способ
function sum() {
  let total = 0;
  for (let i = 0; i < arguments.length; i++) {
    total += arguments[i];
  }
  return total;
}

// Хорошо: rest параметры
const sum = (...args) => {
  return args.reduce((acc, val) => acc + val, 0);
};

sum(1, 2, 3, 4, 5);  // 15

Преимущества rest параметров:

  • Явно видно, что функция принимает переменное количество аргументов
  • Это настоящий массив (не псевдомассив)
  • Работает в стрелочных функциях
  • Более читаемый код

Решение 2: Обычная функция с arguments

Если нужен arguments, используй обычную функцию:

// arguments работает в обычных функциях
function variadic() {
  console.log(arguments);  // Arguments(5) [1, 2, 3, 4, 5]
  console.log(arguments.length);  // 5
  console.log(arguments[0]);  // 1
}

variadic(1, 2, 3, 4, 5);

Решение 3: Комбинация rest параметров и обычных параметров

const greet = (greeting, ...names) => {
  console.log(`${greeting} ${names.join(", ")}!`);
};

greet("Hello", "Alice", "Bob", "Charlie");
// Hello Alice, Bob, Charlie!

Практические примеры

Логирование функции

// С arguments (старый способ)
function log() {
  const args = Array.from(arguments);
  console.log("Called with:", args);
}

// С rest параметрами (новый способ)
const logModern = (...args) => {
  console.log("Called with:", args);
};

Функция с переменным количеством параметров

// Конкатенация строк
const concatenate = (...strings) => {
  return strings.join("");
};

concatenate("Hello", " ", "World");  // "Hello World"

// Калькулятор
const add = (...numbers) => {
  return numbers.reduce((sum, num) => sum + num, 0);
};

add(1, 2, 3, 4, 5);  // 15

Создание wrapper функции

const originalFunc = (a, b, c) => a + b + c;

const wrapper = (...args) => {
  console.log("Вызов с аргументами:", args);
  return originalFunc(...args);  // Передаём все аргументы дальше
};

wrapper(1, 2, 3);  // Вызов с аргументами: [1, 2, 3], результат: 6

Сравнение arguments и rest параметров

// arguments — это псевдомассив (не настоящий массив)
function testArguments() {
  console.log(arguments instanceof Array);  // false
  console.log(Array.isArray(arguments));  // false
  console.log(arguments.map);  // undefined
  // Нужно преобразовать: Array.from(arguments) или [...arguments]
}

// Rest параметры — это настоящий массив
const testRest = (...args) => {
  console.log(args instanceof Array);  // true
  console.log(Array.isArray(args));  // true
  console.log(args.map);  // function
};

Когда arguments может быть полезен

// Функция, которая принимает первый аргумент и использует остальные
function multiplyAll() {
  const multiplier = arguments[0];
  const values = Array.from(arguments).slice(1);
  return values.map((val) => val * multiplier);
}

multiplyAll(2, 3, 4, 5);  // [6, 8, 10]

// Но с rest параметрами это яснее:
const multiplyAllModern = (multiplier, ...values) => {
  return values.map((val) => val * multiplier);
};

Итог

В стрелочной функции нельзя обратиться к arguments. Это сделано намеренно, потому что стрелочные функции не имеют собственного контекста.

Решение: используй rest параметры

// ПЛОХО: попытка использовать arguments в стрелочной функции
const bad = () => console.log(arguments);  // ReferenceError

// ХОРОШО: используй rest параметры
const good = (...args) => console.log(args);  // [1, 2, 3]

Rest параметры — это лучший вариант для современного JavaScript. Они явные, читаемые и работают во всех типах функций.

Можно ли в стрелочной функции обратиться к псевдомассиву arguments? | PrepBro