114 votes

Chaque fonction Javascript doit-elle retourner une valeur ?

J'utilise Netbeans pour ajouter des commentaires de type professionnel à chaque fonction que j'écris. Je commence donc chacune d'entre elles par /** et ensuite j'appuie sur Enter pour permettre à Netbeans de remplir le schéma de commentaires par défaut pour la fonction suivante.

Jusqu'à présent, je l'ai utilisé uniquement pour le langage PHP et dans ce cas, Netbeans ajoutait toujours @returns {type} dans le schéma de commentaire uniquement, si la fonction PHP suivante est réellement incluse. return déclaration. Sur les "procédures" (fonctions qui ne renvoient aucune valeur), cette partie était absente.

Aujourd'hui j'ai essayé la même chose pour la fonction Javascript et Netbeans a ajouté @returns {undefined} pour commenter le schéma même si la fonction suivante ne renvoie rien.

Cela m'a troublé. Netbeans suggère-t-il ainsi que chaque fonction Javascript doit retourner quelque chose ? Que dois-je faire ? Ignorer (ou supprimer) cette partie du schéma de commentaire ou suivre la suggestion (si c'est bien une suggestion) et ajouter return false; à la fin d'une telle fonction, bien qu'elle soit inutile pour moi ?

211voto

Elias Van Ootegem Points 29404

La réponse courte est non.

El réel La réponse est oui : le moteur JS doit être informé qu'une fonction a terminé son travail, ce qui est fait par le retour de la fonction. C'est aussi pourquoi, au lieu de "terminé" une fonction est dite "sont revenus" .
Une fonction qui n'a pas de déclaration de retour explicite retournera undefined comme une fonction C(++) qui n'a pas de valeur de retour est censée (et sa signature le reflète) renvoyer void :

void noReturn()//return type void
{
    printf("%d\n", 123);
    return;//return nothing, can be left out, too
}

//in JS:
function noReturn()
{
    console.log('123');//or evil document.write
    return undefined;//<-- write it or not, the result is the same
    return;//<-- same as return undefined
}

De plus, en JS, comme dans la plupart des langages, vous êtes libre d'ignorer la valeur de retour d'une fonction, ce que vous faites très souvent :

(function()
{
    console.log('this function in an IIFE will return undefined, but we don\'t care');
}());
//this expression evaluates to:
(undefined);//but we don't care

A certains très bas niveau, le retour se traduit par une sorte de saut. Si une fonction a vraiment retourné rien du tout, il n'y aurait aucun moyen de savoir quand et comment appeler la fonction suivante, ou appeler les gestionnaires d'événements et autres.

Donc pour récapituler : Non, une fonction JS ne doit rien retourner dans votre code. Mais en ce qui concerne les moteurs JS : une fonction toujours renvoie quelque chose, que ce soit explicitement via un return ou implicitement. Si une fonction retourne implicitement, sa valeur de retour sera toujours indéfinie.

36voto

rhapsodyn Points 550

Non, return n'est pas nécessaire.

Quand aucun return est spécifié, undefined est renvoyé.

10voto

T.J. Crowder Points 285826

Chaque fonction Javascript doit-elle retourner une valeur ?

Non, ils ne le font pas. C'est vrai qu'au plus profond du cahier des charges, ce sont tous des légèrement différent :

function foo() {
}
function foo() {
    return;
}
function foo() {
    return undefined;
}

...mais le résultat de en appelant chacun d'entre eux est le même : undefined . Donc, en termes pragmatiques :

  1. Vous n'avez pas besoin d'écrire un return vous pouvez simplement laisser l'exécution du code "tomber à la fin" de la fonction.
  2. Si vous revenez undefined Plus précisément, vous pouvez écrire return;
  3. Lorsque vous appelez une fonction, vous ne pouvez pas dire (dans le code) si l'exécution est tombée à la fin, s'est terminée par return; ou se terminant par return undefined; ; ils ont tous exactement la même apparence pour votre code d'appel.

Re la spécification : Plus précisément, lorsque l'exécution d'une fonction tombe à la fin, dans la spécification, il s'agit d'un achèvement "normal", mais return; y return value; sont tous deux des compléments "de retour" avec une valeur associée ( undefined ), qui est (très légèrement) différent. Mais la différence est éliminée par la sémantique de appeler une fonction qui disent :

...

  1. Si résultat Le [[Type]] est return , return NormalCompletion( résultat . [Valeur]]).
  2. ReturnIfAbrupt( résultat ).
  3. Retourner NormalCompletion( indéfini ).

Il n'y a donc aucune différence que vous pouvez observer dans le code.

2voto

mohkhan Points 4068

Non, vous n'êtes pas obligé de retourner quelque chose pour chaque fonction. C'est facultatif et dépend de la façon dont vous écrivez votre code logique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X