2015-10-22 18 views
25

Non so se le funzioni di freccia associno arguments a un ambito lessicale o meno.Le funzioni freccia ES6 hanno i loro argomenti o no?

Date un'occhiata a questo esempio (lo stesso concetto può essere utilizzato per this):

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

Quando ho eseguito questo su Chrome, ottengo [1,2,3], ma su Firefox, ottengo [4,5,6]. Cosa sta succedendo?

+0

direi Firefox ha bene questa volta, anche se ho sicuramente capisco perché Chrome si comporta in questo modo lo fa. Bella scoperta! –

+0

@StephanBijzitter in base alle risposte che non ha:/ –

+2

@StephanBijzitter no, Chrome ha capito bene. – naomik

risposta

19

Dal spec:

Qualsiasi riferimento ad arguments, super, this, o all'interno di un new.target ArrowFunction deve risolvere ad un legame in un ambiente lessicalmente racchiude.

Pertanto, la risposta corretta sarebbe [1,2,3]. Firefox ha risolto il problema nella versione 43 (bug 889158).

9

No, le funzioni freccia non hanno il proprio arguments, this, super o new.target.

Leggere la nota alla 14.2.16 Runtime Semantics: Evaluation:

Un ArrowFunction non definisce attacchi locali per arguments, super, this o new.target. Qualsiasi riferimento a arguments, super, this o new.target all'interno di ArrowFunction deve essere risolto in un binding in un ambiente che racchiude lessicamente. In genere questo sarà il Function Environment di una funzione che chiude immediatamente.

+0

Qualsiasi riferimento? –

-3

Quello che sta succedendo è in realtà piuttosto semplice. Chrome non sembra aggiungere un oggetto arguments all'ambito della funzione interna (freccia), mentre Firefox lo fa.

Ciò significa che gli argomenti registrati in Chrome sono gli argomenti passati alla funzione padre, che è una funzione "normale".

Firefox crede (e secondo la mia opinione hanno ragione a) che le funzioni di freccia debbano anche avere l'oggetto arguments, e quindi è per questo che registrano il secondo gruppo di numeri.

Come altri hanno già detto, ciò che Firefox fa è contrario alle specifiche.

+3

La specifica ECMAScript è quella che è. Chrome implementa le specifiche ed è quindi corretto. Firefox non è corretto indipendentemente da quali opinioni potrebbero esistere. – naomik

+1

Ed è quello che sono le parentesi per ;-) –

+1

Cosa intendi per Firefox "ha il diritto" di credere a quale dovrebbe essere il comportamento di ECMAScript? – naomik

2

Le funzioni di freccia non hanno i propri argomenti oggetto.

funzioni Arrow non espongono un oggetto arguments per il loro codice: arguments.length, arguments[0], arguments[1], e così via non riferiscono agli argomenti forniti alla funzione freccia quando viene chiamato.

Arrow_functions

Per questo esempio

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

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

risposta corretta dovrebbe essere [1, 2, 3]

Problemi correlati