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

Я не знаю, связывают ли функции стрелок arguments в лексической сфере или нет.

Посмотрите на этот пример (ту же концепцию можно использовать для this):

var b = function() { return () => console.log(arguments); };
b(1,2,3)(4,5,6); // different result of chrome vs FF.

Когда я запускаю это на Chrome, я получаю [1,2,3], но на Firefox я получаю [4,5,6], В чем дело?

4 ответа

Решение

Из спецификации:

Любая ссылка на arguments, super, this, или же new.target внутри ArrowFunction должна разрешаться привязка в лексически закрытой среде.

Следовательно, правильный ответ будет [1,2,3], Firefox исправил проблему в версии 43 ( ошибка 889158).

Нет, функции стрелок не имеют своих arguments, this, super, или же new.target,

См. Примечание в 14.2.16. Семантика времени выполнения: оценка:

ArrowFunction не определяет локальные привязки для arguments, super, this, или же new.target, Любая ссылка на arguments, super, this, или же new.target внутри ArrowFunction должна разрешаться привязка в лексически закрытой среде. Как правило, это будет Function Environment непосредственно вмещающей функции.

Функции стрелок не имеют своих собственных объектов аргументов.

Функции со стрелками не предоставляют объект аргументов в свой код: arguments.length, arguments[0], arguments[1]и т. д. не ссылаются на аргументы, предоставленные функции стрелки при вызове.

Arrow_functions

Для этого примера

var b = function() {
  return () => console.log(arguments);
};

b(1,2,3)(4,5,6);

правильный ответ должен быть [1, 2, 3]

То, что происходит, на самом деле довольно просто. Хром, кажется, не добавляет arguments возражать против объема внутренней (стрелки) функции, в то время как Firefox делает.

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

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

Как говорили другие, то, что делает Firefox, противоречит спецификации.

Другие вопросы по тегам