2015-06-19 9 views
18
(() => console.log(arguments))(1,2,3); 

// Chrome, FF, Node give "1,2,3" 
// Babel gives "arguments is not defined" from parent scope 

Secondo Babel (e da quello che posso dire i primi consigli del TC39), questo è "non valido" poiché le funzioni di freccia dovrebbero utilizzare il loro ambito genitore per gli argomenti. Le uniche informazioni che sono riuscito a trovare che contraddicono questo è un singolo commento che dice che questo è stato rifiutato dal TC39, ma non riesco a trovare nulla a sostegno di ciò.Informazioni ufficiali su `arguments` in ES6 Arrow functions?

Solo cercando documenti ufficiali qui.

+0

http://www.ecma-international.org/ecma -262/6.0/index.html # sec-freccia-funzione-definizioni-runtime-semantica-valutazione - vedere le note –

risposta

24

Chrome, FF, e il nodo sembrano essere sbagliato qui, Babel è corretto: funzioni

freccia non hanno una propria arguments vincolante nella loro portata; nessun argomento oggetto viene creato quando li chiama.

alla ricerca di documentazione ufficiale qui

espressioni di funzione Freccia restituiscono funzioni che have their [[ThisMode]] set a lexical, e quando tale sono chiamati i declaration instantiation non crea un arguments object. C'è anche una nota specifica (18 a) che afferma che "le funzioni di freccia non hanno mai un argomento" ".

17

Come notato da Bergi, le funzioni freccia non hanno la propria variabile arguments.

Tuttavia, se si desidera catturare le args per la vostra funzione di freccia, si può semplicemente utilizzare un rest parameter

const myFunc = (...args) => 
 
    console.log ("arguments", args) 
 
    
 
myFunc (1, 2, 3) 
 
// arguments [1, 2, 3]

+0

Sì, ma la versione transpiled di questo è un ciclo for sugli argomenti; significativamente più codice aggiunto –

+1

'/ me shrugs' - Credo che in realtà non mi interessi l'output transpiled nella maggior parte dei casi. C'è più codice aggiunto, certo, ma non è come se non funzionasse. Se ti interessa l'output transpiled, probabilmente non dovresti usare un transpiler in primo luogo. Voglio dire, basta guardare l'uscita transpiled per un generatore o un incarico destrutturante ... – naomik

+2

Il punto è ES6 ti offre un codice sorgente * molto più succinto/espressivo/leggibile *. L'output del codice di build non dovrebbe avere importanza, purché soddisfi le tue aspettative. – naomik