2015-10-22 4 views
25

Ich weiß nicht, ob Pfeil Funktionen Bindung arguments zu einem lexikalischen Bereich oder nicht.Haben ES6-Pfeilfunktionen ihre eigenen Argumente oder nicht?

Werfen Sie einen Blick auf dieses Beispiel (das gleiche Konzept kann für this verwendet werden):

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

Wenn ich dies auf Chrome laufen, bekomme ich [1,2,3], aber auf Firefox, ich [4,5,6]. Was ist los?

+0

Ich würde sagen, Firefox es diesmal richtig bekommen hat, obwohl ich auf jeden Fall verstehen warum verhält sich Chrome so? es tut. Schöner Fund! –

+0

@StephanBijzitter nach Antworten es nicht:/ –

+2

@StephanBijzitter nein, Chrome hat es richtig gemacht. – naomik

Antwort

19

Vom spec:

Jede Bezugnahme auf arguments, super, this oder new.target innerhalb eines ArrowFunction muss eine Bindung in einer lexikalisch einschließe Umgebung lösen.

Daher wäre die richtige Antwort [1,2,3]. Firefox hat das Problem in Version 43 behoben (bug 889158).

9

Nein, Pfeilfunktionen haben keine eigenen arguments, this, super oder new.target.

Siehe Hinweis auf 14.2.16 Runtime Semantics: Evaluation:

Ein ArrowFunction nicht lokale Bindungen für arguments, super, this oder new.target nicht definiert. Jede Bezugnahme auf arguments, super, this oder new.target innerhalb einer ArrowFunction muss zu einer Bindung in einer lexikalisch umschließenden Umgebung aufgelöst werden. Typischerweise wird dies die Function Environment einer unmittelbar einschließenden Funktion sein.

+0

Irgendwelche Referenz? –

-3

Was passiert ist in der Tat ziemlich einfach. Chrome scheint kein Objekt arguments dem Bereich der inneren (Pfeil) -Funktion hinzuzufügen, während Firefox dies tut.

Dies bedeutet, dass die in Chrome protokollierten Argumente die Argumente sind, die an die übergeordnete Funktion übergeben werden, die eine "normale" Funktion ist.

Firefox glaubt (und meiner Meinung nach sind sie richtig zu), dass die Pfeilfunktionen auch das arguments Objekt haben sollten, und deshalb loggen sie den zweiten Satz von Zahlen ein.

Wie andere sagten, was Firefox tut ist gegen die Spezifikation.

+3

Die ECMAScript-Spezifikation ist, was es ist. Chrome implementiert die Spezifikation und ist daher korrekt. Firefox ist inkorrekt, unabhängig davon, welche Meinungen existieren. – naomik

+1

Und das ist die Klammer für ;-) –

+1

Was meinst du Firefox hat "das Recht" zu glauben, was ECMAScript Verhalten sein sollte? – naomik

2

Pfeilfunktionen haben kein eigenes Argument.

Pfeil Funktionen setzen Sie nicht ein Argumente zu ihren Code Objekt: arguments.length, arguments[0], arguments[1] und so weiter nicht beziehen sich auf die Argumente der Pfeilfunktion versehen, wenn sie aufgerufen.

Arrow_functions

Für dieses Beispiel

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

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

muss die richtige Antwort sein [1, 2, 3]