Есть ли у стрелочных функций 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, противоречит спецификации.