2015-02-27 29 views
364

In caso di restituzione di un oggetto da una funzione di freccia, sembra che sia necessario utilizzare un ulteriore set di {} e una dichiarazione di ritorno a causa di un'ambiguità nella grammatica:funzione freccia ECMAScript6 che restituisce un oggetto

p => { return { foo: 'bar' } }

Se la funzione freccia ritorna ogni altra cosa, il {} e ritorno non sono necessari, ad esempio:

p => 'foo'

c'è qualcosa di ovvio che mi manca?

risposta

632

È necessario racchiudere tra parentesi il letterale dell'oggetto restituito. In caso contrario, verranno considerate le parentesi graffe per indicare il corpo della funzione. Le seguenti opere:

p => ({ foo: 'bar' }); 

Non c'è bisogno di avvolgere qualsiasi altra espressione in parentesi:

p => 10; 
p => 'foo'; 
p => true; 
p => [1,2,3]; 
p => null; 
p => /^foo$/; 

e così via.

+4

Sono curioso * perché * i paren fanno la differenza. – wrschneider

+18

@wrschneider perché senza parents js parser pensa che sia un corpo di funzione, non un oggetto, e foo è [un'etichetta] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label) – alexpods

+7

Il wrapping del letterale dell'oggetto tra parentesi segnala che le parentesi sono un oggetto letterale invece del corpo della funzione. –

37

Ci si potrebbe chiedere, perché la sintassi è valida (ma non funziona come previsto):

var func = p => { foo: "bar" } 

E 'a causa di JavaScript's label syntax:

Quindi, se si transpile il codice qui sopra per ES5, dovrebbe apparire come:

var func = function (p) { 
    foo: 
    "bar"; //obviously no return here! 
} 
2

Se il corpo della funzione freccia è avvolto in parentesi graffe, non è implicitamente restituito. Avvolgi l'oggetto tra parentesi. Sarebbe simile a questo.

p => ({ foo: 'bar' }) 

Avvolgendo il corpo in parentesi, la funzione restituirà { foo: 'bar }.

Speriamo che questo risolva il problema. In caso contrario, ho recentemente scritto un articolo sulle funzioni di Arrow che lo copre in modo più dettagliato. Spero che lo trovi utile Javascript Arrow Functions

+4

La pubblicazione di un collegamento al proprio blog è problematica. Si prega di leggere [Come non essere uno spammer] (/ aiuto/promozione). – tripleee

+3

Il solo collegamento alla tua libreria o tutorial non è una buona risposta. Collegandovi, spiegando perché risolve il problema, fornendo codice su come farlo e disconoscendo che l'hai scritto, si ottiene una risposta migliore. Vedi: [** Cosa significa "Buono" autopromozione? **] (// meta.stackexchange.com/q/182212) –

+0

Sicuramente ho risposto alla domanda nella prima frase, però? Avendo controllato la guida su come non essere uno spammer, sento che la mia risposta rientra nelle linee guida. –

Problemi correlati