Почему функция стрелок ES6 не поддерживает объект Arguments? [Дубликат]

Использование:

int a=[10] = {1, 2, 3, 4, 5};
int n = sizeof(a);
printf("%d", n);

Выход:

5

Причина: вычисляет количество элементов, хранящихся в массиве, а не количество свободных пространств, выделенных ему.

24
задан Mark Kahn 11 February 2018 в 07:00
поделиться

2 ответа

Хром, FF и узел кажутся неправильными здесь, Бабель прав:

Функции стрелок не имеют собственного arguments привязки в своей области; no arguments object создается при их вызове.

ищет официальные документы здесь

Выражения функции функции для функций, которые имеют свои [[ThisMode ]] установите на lexical, а когда они называются манифестацией объявления , не создается объект arguments . Существует даже примечание (18а), в котором указано, что «функции Arrow никогда не имеют объектов аргументов. ».

30
ответ дан Pointy 15 August 2018 в 19:20
поделиться
  • 1
    В настоящее время функция Chrome arrow генерирует исключение при попытке доступа к arguments – Dmitry Masley 19 April 2018 в 08:57

Как отмечал Берги, функции стрелок не имеют своей собственной переменной arguments.

Однако, если вы хотите захватить args для своей функции стрелки, вы можете просто использовать параметр останова

const myFunc = (...args) =>
  console.log ("arguments", args)
  
myFunc (1, 2, 3)
// arguments [1, 2, 3]

Параметры останова могут быть объединены с другими позиционными параметрами, но всегда должны быть включены как last

const myFunc = (a, b, c, ...rest) =>
  console.log (a, b, c, rest)

myFunc (1, 2, 3, 4, 5, 6, 7)
// 1 2 3 [ 4, 5, 6, 7 ]

Если вы допустили ошибку записи параметра отдыха в любой другой позиции, вы получите сообщение об ошибке

const myFunc = (...rest, a, b, c) =>
  console.log (a, b, c, rest)
  
myFunc (1, 2, 3, 4, 5, 6, 7)
// Error: Rest parameter must be last formal parameter

26
ответ дан user633183 15 August 2018 в 19:20
поделиться
  • 1
    Да, но преобразованная версия - это цикл за аргументами; значительно больше добавленного кода – Mark Kahn 22 June 2015 в 08:05
  • 2
    /me shrugs - Наверное, в большинстве случаев меня не волнует выданный вывод. Там добавлен еще один код, но это не так, как будто он не работает. Если вы заботитесь о вытеснённом выходе, вы, вероятно, не должны использовать транспилятор в первую очередь. Я имею в виду, просто посмотрите на переданный вывод для генератора или назначения деструкции ... – user633183 22 June 2015 в 08:21
  • 3
    Дело в том, что ES6 дает вам более сжатый / выразительный / читаемый код source . Вывод кода сборки не должен иметь большого значения, пока он все еще выполняет ваши ожидания. – user633183 22 June 2015 в 08:21
  • 4
    Yeah but... who cares ? - Я, по крайней мере, за то, над чем сейчас работаю. В общем, я согласен, но ненужный for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } слишком тяжел для моего текущего проекта, когда я делаю такие вещи, как написание помощников языковых функций (map = (...args) => flip(args)). Наличие этого дополнительного кода 20 раз слишком много. Это не проблема его расширения в больший источник, чем оригинал, это проблема его расширения в значительно больше источника, чем я мог бы написать (ваш второй ex хороший) – Mark Kahn 22 June 2015 в 10:33
  • 5
    Но все это не в тему для этого вопроса;) – Mark Kahn 22 June 2015 в 10:35
Другие вопросы по тегам:

Похожие вопросы: