2015-10-22 3 views
25

Не знаю, есть ли функции стрелки связывать arguments с лексической областью или нет.У функций стрелок ES6 есть свои собственные аргументы или нет?

Взгляните на этот пример (та же концепция может быть использована для 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]. Что происходит?

+0

Я бы сказал, Firefox получил это право на этот раз, хотя я определенно понимаю почему Chrome ведет себя так оно делает. Хорошая находка! –

+0

@StephanBijzitter в соответствии с ответами нет:/ –

+2

@StephanBijzitter нет, Chrome получил это право. – naomik

ответ

19

Из spec:

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

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

9

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

Смотрите примечание 14.2.16 Runtime Semantics: Evaluation:

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

+0

Любые ссылки? –

-3

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

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

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

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

+3

Спецификация ECMAScript - это то, что есть. Chrome реализует спецификацию и поэтому является правильным. Firefox некорректен, независимо от того, какие мнения могут существовать. – naomik

+1

И вот для чего скобки:;) –

+1

Что значит «правильно», чтобы верить в поведение ECMAScript? – naomik

2

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

функции стрелки не разоблачить аргументы возражают против их код: 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]

Смежные вопросы