Я не знаю, может ли стрелка связывать 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]
. Что происходит?
Ответ 1
Из spec:
Любая ссылка на arguments
, super
, this
или new.target
в пределах ArrowFunction должен разрешить привязку в лексически закрытом окружающая среда.
Поэтому правильный ответ будет [1,2,3]
. Firefox исправил проблему в версии 43 (ошибка № 889158).
Ответ 2
Нет, функции стрелок не имеют собственных arguments
, this
, super
или new.target
.
См. примечание в 14.2.16 Семантика времени выполнения: Оценка:
Функция ArrowFunction не определяет локальные привязки для arguments
, super
, this
или new.target
. Любая ссылка на arguments
, super
, this
или new.target
в пределах ArrowFunction должна быть разрешена привязкой в лексически окружении. Обычно это будет Function Environment
сразу включающей функции.
Ответ 3
Функции стрелки не имеют собственного объекта аргументов.
Функции стрелок не выставляют объект-аргумент в свой код: arguments.length
, arguments[0]
, arguments[1]
и т.д. обратитесь к аргументам, предоставленным функции стрелки при вызове.
Arrow_functions
В этом примере
var b = function() {
return () => console.log(arguments);
};
b(1,2,3)(4,5,6);
Ответ 4
То, что происходит, на самом деле довольно просто. Chrome, похоже, не добавляет объект arguments
к области внутренней функции (стрелки), в то время как Firefox делает.
Это означает, что аргументы, зарегистрированные в Chrome, являются аргументами, переданными родительской функции, которая является "нормальной" функцией.
Firefox верит (и, на мой взгляд, они правы), что функции стрелок также должны иметь объект arguments
, и поэтому они регистрируют второй набор чисел.
Как говорили другие, то, что делает Firefox, не соответствует спецификации.