Quelle est la différence entre return et return ()?


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

J'ai testé le code ci-dessus dans la console de Chrome, et les deux sont revenus 1.

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

J'ai également testé le code ci-dessus et les deux fonctions sont retournées "1".

Alors, quelle est la différence entre utiliser returnet return()?


21
Les réponses ici s'appliqueront également à void(x),typeof(x)
Paul S.

3
@ PaulS. — était toujours perplexe void(0)car il est censé être un raccourci pour indéfini . Donc, si c'est un raccourci, pourquoi inclure des caractères inutiles? ;-)
RobG

1
@RobG Je pense que c'est un report de Python et peut en fait être utile pour des cas particuliers où vous souhaitez inclure des opérateurs void i = 1; // ReferenceErrorvsvoid (i = 1); // undefined
Paul S.

1
Vous pourriez être amusé par cette question, qui est votre question appliquée à C #: stackoverflow.com/questions/2186595/…
Eric Lippert

Réponses:


177

Le même qu'entre

var i = 1 + 1;

et

var i = (1 + 1);

Ce n'est rien. Les parenthèses sont autorisées car elles sont autorisées dans n'importe quelle expression à influencer l'ordre d'évaluation, mais dans vos exemples, elles sont simplement superflues.

returnn'est pas une fonction, mais une déclaration . Il est syntaxiquement similaire à d'autres instructions de flux de contrôle simples comme breaket continuequi n'utilisent pas non plus de parenthèses.


12
Une instruction return peut être suivie d'une expression. Un retour doit être dans une fonction, donc la fonction renvoie la valeur de l'expression, ou s'il n'y en a pas, indéfinie .
RobG

37
@ chris97ong: le retour n'est pas une fonction.
RemcoGerlich

34
Si vous en faites returnune fonction, comment en renverriez-vous une valeur?
dan04

4
C'est une excellente réponse avec un excellent exemple, mais je pense qu'il vaut peut-être la peine d'ajouter que le «retour» n'est pas une fonction dans la réponse principale - étant donné que c'est la racine du malentendu qui a conduit à cette question.
BiscuitBaker

3
@BiscuitBaker: J'ai ajouté un peu. Quand j'ai noté cette courte réponse, je ne m'attendais pas à ce qu'elle obtienne plus de 50 votes positifs ...
RemcoGerlich

21

Il n'y a pas de différence.

returnn'est pas un appel de fonction, mais une instruction de langage. Tout ce que vous faites avec les parenthèses est simplement de regrouper votre valeur de retour afin qu'elle puisse être évaluée. Par exemple, vous pouvez écrire:

return (x == 0);

Dans ce cas, vous retournez la valeur de l'instruction x == 0, qui renverra un booléen trueou en falsefonction de la valeur de x.


6
return est un mot-clé qui signifie le début d'une instruction return .
RobG

1
L'évaluation de l'instruction de retour ne nécessite aucun "regroupement". Donc, dans tous les cas, il y aura un retour booléen.
Wolf

18

En fait, ici, la priorité de ()est plus élevée, donc il évalue en premier:

Ici d'abord, ("1")soyez évalué, de la manière suivante:

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

donc la déclaration ci-dessus est équivalente à:

return "1";

Voir visuellement:

viusal

Il n'y a donc fondamentalement aucune différence de fonctionnalité, mais la seconde peut être un peu lente car elle résout d'abord les crochets.


2
Pourquoi feriez-vous une affirmation totalement non vérifiée selon laquelle "le deuxième pourrait être un peu plus lent" alors que ce n'est pas le cas?

9

Il n'y a absolument aucune différence. Si vous regardez la spécification JS (ECMAScript) de l' instruction de retour . Entre autres choses, il vous dit:

return [aucun LineTerminator ici] Expression;

que vous pouvez exprimer return. L' expression est hello, Math.abs(x), yourCustomFunc(7)ou cela peut être dans votre second cas 1ou (1). L'expression 1après évaluation est la même (1)et la même (((((1))))))chose que quelque chose de vraiment bizarre (+(!(+(!1)))).


1
+1 pour la référence officielle. N'y a-t-il pas une référence page par page? - Le HTML d'une page se charge très longtemps.
Wolf

@Wolf je n'ai pas trouvé un tel. En voici une autre, mais c'est aussi une page people.mozilla.org/~jorendorff
Salvador Dali

Oui, triste. Je ne réussirais pas non plus. Pourquoi ne pas étendre votre devis à toute la syntaxe de l'instruction de retour?
Wolf

9

Il n'y a pas de différence, les parenthèses sont facultatives. Voir MSDN :

return[(][expression][)];

L'argument d'expression facultatif est la valeur à renvoyer par la fonction. En cas d'omission, la fonction ne renvoie pas de valeur.

Vous utilisez l'instruction return pour arrêter l'exécution d'une fonction et renvoyer la valeur d'expression. Si l'expression est omise ou qu'aucune instruction return n'est exécutée à partir de la fonction, l'expression qui a appelé la fonction actuelle reçoit la valeur indéfinie.


8
Seuls les États membres penseraient à rendre le regroupement "facultatif" dans une instruction de retour . Ils sont aussi "facultatifs" que dans n'importe quelle expression, ou dans de nombreuses autres parties de la grammaire.
RobG

@RobG: Mais apparemment, ils sont beaucoup plus susceptibles d'être interrogés dans une returndéclaration. : P MS s'est probablement fatigué de répondre à la question de JS noobs.
cHao

2
L'explication M $ est incorrecte. Le (), ne fait pas partie de l'instruction de retour.
Salman A

4
"Il y a une différence pour le lecteur." Eh bien, oui: la spécification MSDN implique à tort cela return (expressionet return expression)est légale.
Jim Balter

2
@JimBalter avec return (), return (et return ): P
Paul

9

returnest une instruction, un mot-clé qui démarre l'instruction de retour , pas une fonction.

Comme cela a été mentionné, les parenthèses supplémentaires affectent l'ordre d'évaluation, mais ne sont pas utilisées pour "exécuter" la fonction nommée return. C'est pourquoi ces lignes fonctionnent sans aucun problème:

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

Ils sont, en effet, identiques à ces lignes:

return 1;
var a = 1;

La raison return()génère une erreur de syntaxe est la raison exacte pour laquelle la ligne suivante renvoie une erreur (instruction de retour incluse à des fins de comparaison):

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

Et juste en remarque, si cela returnn'inclut rien après, cela suppose que vous vouliez revenir undefined.
IQAndreas

@Wolf Les expressions sont facultatives, donc returnen soi est une instruction de retour.
Paul

6

Il y a une énorme différence pour les humains, et aucune différence pour le moteur Javascript.

return 1est une instruction déclarant que nous devons immédiatement quitter la fonction donnant la valeur 1.

return(1)est la même déclaration déguisée que l' appel de fonction par la convention idiote que vous n'êtes pas obligé d'insérer un espace en dehors des parenthèses en Javascript. Si vous utilisez un code comme celui-ci dans le système de production, n'importe quel responsable viendra à votre bureau avec un pieu et des torches, après avoir passé un certain temps à essayer de décider si vous avez vraiment une return()fonction quelque part dans la base de code ou si vous ne savez tout simplement pas à quoi returnsert le mot-clé.

Comme beaucoup d'autres personnes l'ont déjà correctement dit, les parenthèses ne font rien sauf "grouper" avec une priorité plus élevée le littéral pour le nombre 1.


3
"Il y a une énorme différence pour les humains" - Pas compétents. "la même déclaration déguisée en appel de fonction" - il n'y a pas de returnfonction. "la convention idiote que vous n'êtes pas obligé d'insérer un espace en dehors des parenthèses en Javascript" - presque aucun langage ne l'exige; appeler cet idiot est idiot. "n'importe quel responsable viendra à votre bureau avec un pieu et des torches" - aucun compétent ne le ferait. return(1)C'est une mauvaise pratique, mais les gens qui s'énervent à propos de telles choses gaspillent des ressources et créent une mauvaise ambiance.
Jim Balter

@JimBalter "Pas compétents" - ha! "Presque aucune langue ne l'exige" - c'est pourquoi j'ai dit "convention". Si c'est idiot, ça s'appelle «idiot». "Il n'y a pas de returnfonction" - le fait que l'interpréteur vous interdise d'enregistrer une fonction avec un nom returnn'aidera pas le lecteur du code à ne pas remettre en question sa santé mentale en premier, ce code est donc du gaspillage. return(1)n'est pas seulement une «mauvaise pratique», c'est un signe dangereux de quelqu'un qui ne sait pas ce qu'il fait!
hijarian

2
Donc, soit vous ne savez pas ce que signifie «obligé», soit vous modifiez votre demande… de toute façon je ne perdrai plus mon temps avec vous.
Jim Balter

Je doute de la vérité de votre dernière phrase; returna (dans toutes les langues que je connais qui ont ce mot-clé) la moindre priorité. Ainsi, si l'expression facultative est présente, elle est toujours évaluée en premier.
Loup

4

Dans l'instruction return, les parenthèses autour de l'expression sont déjà intégrées.

En JavaScript, comme dans de nombreux autres langages (comme C, C ++, Java, Python), l'instruction return comporte deux parties: le mot-clé returnet une expression (facultative). Donc, dans tous les cas, tout ce qui suit le returnmot-clé est d' abord évalué comme une expression , après cela, l'instruction return est "exécutée" en renvoyant le contrôle à l'appelant.

Utiliser ou ne pas utiliser les parenthèses est une question de style , alors que la plupart des guides de style les interdisent pour des cas triviaux comme celui cité dans votre question, car cela fait que le retour ressemble à une fonction.

Addendum ultérieur

Si entre parenthèses ou sans, n'oubliez jamais de placer l'expression facultative derrière le return, c'est-à-dire sur la même ligne. Le véritable piège avec returnJavaScript réside dans l'ajout d'un saut de ligne après celui-ci:

function test() {
  return 
  1;
}

... parce que la testfonction ci-dessus reviendra undefined.


1

en ajoutant des parenthèses, nous nous sommes assurés que javascript n'insère pas de point-virgule avant plusieurs instructions écrites après retour, pour référence: - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar #Automatic_semicolon_insertion

exemple :

return a + b;

se transforme en

return; a + b;

par ASI.

La console avertira "code inaccessible après l'instruction de retour". Pour éviter ce problème (pour éviter ASI), vous pouvez utiliser des parenthèses:

return ( a + b );
code copié depuis: - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/return


C'est tout à fait correct et c'est logique pour les expressions complexes. Mais vous devriez ajouter sur la même ligne ou directement derrière return dans la première phrase pour le rendre encore plus clair. Je pense que le vote négatif vient d'une mauvaise interprétation de cela.
Loup
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.