Qual'è la differenza tra return e return ()?


97
function a() { return 1; }
function b() { return(1); }

Ho testato il codice sopra nella console di Chrome ed entrambi sono tornati 1.

function c() { return "1"; }
function d() { return("1"); }

Ho anche testato il codice sopra ed entrambe le funzioni sono state restituite "1".

Allora qual è la differenza tra usare returne return()?


21
Le risposte qui si applicano anche a void(x),typeof(x)
Paul S.

3
@ PaulS. — era sempre perplesso da void(0)quando dovrebbe essere una scorciatoia per indefinito . Quindi, se è una scorciatoia, perché includere caratteri non necessari? ;-)
RobG

1
@RobG Penso che sia un trasferimento da Python e potrebbe effettivamente essere utile per casi speciali in cui si desidera includere operatori void i = 1; // ReferenceErrorrispetto avoid (i = 1); // undefined
Paul S.

1
Potresti essere divertito da questa domanda, che è la tua domanda applicata a C #: stackoverflow.com/questions/2186595/…
Eric Lippert

Risposte:


177

Lo stesso di tra

var i = 1 + 1;

e

var i = (1 + 1);

Cioè niente. Le parentesi sono consentite perché sono consentite in qualsiasi espressione per influenzare l'ordine di valutazione, ma nei tuoi esempi sono semplicemente superflue.

returnnon è una funzione, ma una dichiarazione . È sintatticamente simile ad altre semplici istruzioni del flusso di controllo come breake continueche non usano nemmeno le parentesi.


12
Un'istruzione return può essere seguita da un'espressione. Un ritorno deve essere in una funzione, quindi la funzione restituisce il valore dell'espressione o, se non ce n'è uno, non definito .
RobG

37
@ chris97ong: il ritorno non è una funzione.
RemcoGerlich

34
Se returndiventassi una funzione, come restituiresti un valore da essa?
dan04

4
Questa è un'ottima risposta con un ottimo esempio, ma penso che potrebbe valere la pena aggiungere che "ritorno" non è una funzione nella risposta principale, considerando che è la radice del malinteso che ha portato a questa domanda.
BiscuitBaker

3
@BiscuitBaker: ho aggiunto un po '. Quando ho annotato questa breve risposta non mi aspettavo che ottenesse oltre 50 voti positivi ...
RemcoGerlich

21

Non c'è differenza.

returnnon è una chiamata di funzione, ma è un'istruzione del linguaggio. Tutto quello che stai facendo con le parentesi è semplicemente raggruppare il valore di ritorno in modo che possa essere valutato. Ad esempio, potresti scrivere:

return (x == 0);

In questo caso, restituisci il valore dell'istruzione x == 0, che restituirà un valore booleano trueo in falsebase al valore di x.


6
return è una parola chiave che indica l'inizio di un'istruzione return .
RobG

1
La valutazione della dichiarazione di reso non necessita di "raggruppamento". Quindi in ogni caso ci sarà un ritorno booleano.
Wolf

18

In realtà qui la precedenza di () è maggiore, quindi valuta prima:

Qui per prima cosa fatti ("1")valutare, nel modo seguente:

("1")                     ==> "1"
("1","2")                 ==> "2"
("1","2","3")             ==> "3"
("1"+"2","2"+"2","3"+"2") ==> "32"
(2+3+6)                   ==>  11

quindi l'affermazione sopra è equivalente a:

return "1";

Vedi visivamente:

viusale

Quindi praticamente non c'è differenza di funzionalità, ma il secondo potrebbe essere un po 'lento in quanto risolve in primo luogo le parentesi.


2
Perché dovresti fare un'affermazione completamente non verificata che "il secondo potrebbe essere un po 'più lento" quando non è così?

9

Non c'è assolutamente alcuna differenza. Se guarderai la specifica JS (ECMAScript) dell'istruzione return . Tra molte altre cose, ti sta dicendo:

return [nessun LineTerminator qui] Expression;

a cui puoi fornire espressione return. Espressione è hello, Math.abs(x), yourCustomFunc(7), o nel vostro secondo caso questo può essere 1o (1). L'espressione 1dopo la valutazione è uguale (1)e uguale (((((1))))))o addirittura come qualcosa di veramente bizzarro come (+(!(+(!1)))).


1
+1 per il riferimento ufficiale. Non c'è un riferimento pagina per pagina? - L'HTML di una pagina viene caricato molto a lungo.
Wolf

@Wolf non ho trovato tale. Eccone un altro, ma è anche una pagina people.mozilla.org/~jorendorff/…
Salvador Dali

Sì, triste. Inoltre non avrei avuto successo. Che ne dici di espandere il tuo preventivo all'intera sintassi della dichiarazione di reso?
Wolf

9

Non c'è differenza, le parentesi sono opzionali. Vedi MSDN :

return[(][expression][)];

L'argomento facoltativo dell'espressione è il valore da restituire dalla funzione. Se omesso, la funzione non restituisce un valore.

Si utilizza l'istruzione return per interrompere l'esecuzione di una funzione e restituire il valore di expression. Se expression viene omessa o nessuna istruzione return viene eseguita dall'interno della funzione, all'espressione che ha chiamato la funzione corrente viene assegnato il valore undefined.


8
Solo gli Stati membri penserebbero di rendere il raggruppamento "facoltativo" in una dichiarazione di ritorno . Sono "opzionali" come in qualsiasi espressione o in molte altre parti della grammatica.
RobG

@ RobG: Ma a quanto pare, è molto più probabile che venga chiesto loro in una returndichiarazione. : P MS probabilmente si è stancato di rispondere alla domanda dei niubbi JS.
cHao

2
La spiegazione M $ non è corretta. Il (), non fa parte dell'istruzione return.
Salman A

4
"C'è una differenza per il lettore." Ebbene sì: le specifiche MSDN lo implicano erroneamentereturn (expression e return expression)sono legali.
Jim Balter

2
@JimBalter Insieme a return (), return (e return ): P
Paul

9

returnè un'istruzione una parola chiave che avvia l'istruzione return , non una funzione.

Come è stato detto, le parentesi extra influenzano l'ordine di valutazione, ma non sono usate per "eseguire" la funzione denominata return. Ecco perché queste linee funzionano senza problemi:

return (1);
var a = (1);

Sono, in effetti, identici a queste linee:

return 1;
var a = 1;

Il motivo return()genera un errore di sintassi è il motivo esatto per cui la riga seguente genera un errore (istruzione di ritorno inclusa per il confronto):

return();    // SyntaxError: syntax error
var a = ();  // SyntaxError: syntax error

E proprio come nota a margine, se returnnon include nulla dopo, presume che tu voglia tornare undefined.
IQAndreas

@Wolf L'espressione è facoltativa, quindi di returnper sé è un'istruzione di ritorno.
Paul

6

C'è un'enorme differenza per gli umani e nessuna differenza per il motore Javascript.

return 1è un'istruzione che dichiara che è necessario uscire immediatamente dalla funzione restituendo il valore 1.

return(1)è la stessa affermazione mascherata da chiamata di funzione dalla convenzione idiota che non sei obbligato a inserire spazio al di fuori delle parentesi in Javascript. Se vuoi usare un codice come questo nel sistema di produzione, qualsiasi manutentore verrà nel tuo ufficio con paletti e torce, dopo aver passato un po 'di tempo a cercare di decidere se hai davvero una return()funzione da qualche parte nel codice base o semplicemente non sai cosareturn serve la parola chiave.

Come molte altre persone hanno già detto correttamente, le parentesi non fanno altro che "raggruppare" con precedenza più alta il letterale del numero 1.


3
"C'è un'enorme differenza per gli esseri umani" - Quelli non competenti. "la stessa affermazione mascherata da chiamata di funzione" - non esiste alcuna returnfunzione. "la convenzione idiota che non sei obbligato a inserire spazio al di fuori delle parentesi in Javascript" - quasi nessun linguaggio lo richiede; chiamare questo idiota è idiota. "qualsiasi manutentore verrà nel tuo ufficio con paletti e torce" - nessuno competente lo farebbe. return(1)è una cattiva pratica, ma le persone che si arrabbiano per queste cose stanno sprecando risorse e creando una brutta atmosfera.
Jim Balter

@JimBalter "Non competenti" - ah! "Quasi nessuna lingua lo richiede" - ecco perché ho detto "convenzione". Se è idiota, si chiama "idiota". "Non c'è nessuna returnfunzione" - il fatto che l'interprete ti proibisca di registrare una funzione con un nome returnnon aiuterà il lettore del codice a non mettere in dubbio prima la sua sanità mentale, quindi questo codice è uno spreco. return(1)non è solo "cattiva pratica", è un pericoloso segno di qualcuno che non sa quello che sta facendo!
hijarian

2
Quindi o non sai cosa significa "obbligato", o stai cambiando la tua richiesta ... in ogni caso non sprecherò altro del mio tempo con te.
Jim Balter

Dubito della verità della tua ultima frase; returnha (in tutte le lingue che conosco che hanno questa parola chiave) la minima precedenza. Quindi, se è presente l'espressione facoltativa, viene sempre valutata per prima.
Wolf

4

Nell'istruzione return, le parentesi attorno all'espressione sono già integrate.

In JavaScript, come in molti altri linguaggi (come C, C ++, Java, Python), l'istruzione return ha due parti: la parola chiave returne un'espressione (opzionale). In ogni caso, tutto ciò che segue la returnparola chiave viene prima valutato come un'espressione , dopodiché l'istruzione return viene "eseguita" restituendo il controllo al chiamante.

Usare o non usare le parentesi è una questione di stile , mentre la maggior parte delle guide di stile le proibiscono per casi banali come quello citato nella tua domanda, perché restituisce falsamente l'aspetto di una funzione.

Aggiunta successiva

Se con parentesi o senza, non dimenticare mai di inserire l'espressione facoltativa dietro return, cioè, sulla stessa riga. La vera trappola con returnJavaScript sta nell'aggiunta di un'interruzione di riga dopo di essa:

function test() {
  return 
  1;
}

... perché la testfunzione sopra tornerà undefined.


1

aggiungendo parentesi, ci siamo assicurati che javascript non inserisca un punto e virgola prima di più istruzioni scritte dopo il ritorno, per riferimento: - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar #Automatic_semicolon_insertion

esempio :

return a + b;

si trasforma in

return; a + b;

di ASI.

La console avvertirà "codice non raggiungibile dopo l'istruzione di ritorno". Per evitare questo problema (per prevenire l'ASI), potresti usare le parentesi:

return ( a + b );
codice copiato da: - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/return


Questo è assolutamente corretto e in questo modo ha senso per espressioni complesse. Ma dovresti aggiungere sulla stessa riga o direttamente dopo il ritorno nella prima frase per renderlo ancora più chiaro. Penso che il voto negativo derivi da un'errata interpretazione di questo.
Wolf
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.