web-dev-qa-db-fra.com

Est-ce que chaque fonction Javascript doit retourner une valeur?

J'utilise Netbeans pour ajouter des commentaires de type professionnel à chaque fonction, écris-je. Donc, je commence chacun avec /** puis 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 ne l'utilisais que pour PHP) et dans ce cas, Netbeans ajoutait toujours @returns {type} partie dans le schéma de commentaires uniquement, si vous suivez l'instruction PHP, fonction réellement incluse return]. Dans les "procédures" (fonctions qui ne renvoient aucune valeur), cette partie manquait .

Aujourd'hui, j'ai essayé la même chose pour la fonction Javascript et Netbeans ajouté @returns {undefined} partie à commentaire, même si la fonction suivante ne renvoie rien.

Cela m'a confondu. Netbeans suggère-t-il ainsi que chaque fonction Javascript doit renvoyer quoi que ce soit? Que devrais-je faire? Ignorez (ou supprimez) cette partie du schéma de commentaire ou suivez la suggestion (s'il s'agit d'une suggestion du tout) et ajoutez return false; à la fin d'une telle fonction, même si elle est inutile pour moi?

90
trejder

La réponse courte est non.

La réponse real est oui: le moteur JS doit être averti qu'une fonction a terminé ses activités, ce qui est effectué par la fonction renvoyant quelque chose. C'est aussi pourquoi, au lieu de "fini", une fonction est dite "ont retourné".
Une fonction sans instruction de retour explicite renverra undefined, comme une fonction C (++) qui n'a pas de valeur de retour est dite (et sa signature le reflète) pour 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
}

En outre, dans JS, comme dans la plupart des langues, vous pouvez simplement ignorer la valeur de retour d'une fonction, ce qui est extrêmement difficile:

(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

À un certain niveau très bas, le retour se traduit par une sorte de saut. Si une fonction retournait vraiment rien, il n'y aurait aucun moyen de savoir quoi et quand appeler la fonction suivante, ou appeler des gestionnaires d'événements, etc.

Donc, pour récapituler: non, une fonction JS n'a pas besoin de renvoyer quoi que ce soit dans le code. Mais en ce qui concerne les moteurs JS: une fonction toujours renvoie quelque chose, que ce soit explicitement via une instruction return ou implicitement. Si une fonction retourne implicitement, sa valeur de retour sera toujours indéfinie.

173
Elias Van Ootegem

Non, retour n'est pas nécessaire.

Mais non retour renvoie en réalité le undefined

23
rhapsodyn

Est-ce que chaque fonction Javascript doit retourner une valeur?

Non, ils ne le font pas. Il est vrai que profondément dans la spécification, ils sont tous légèrement différents:

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

... mais le résultat de appelle chacun d'eux est identique: undefined. Donc, en termes pragmatiques:

  1. Vous n'avez pas besoin d'écrire un return, vous pouvez simplement laisser l'exécution de code "tomber de la fin" de la fonction
  2. Si vous retournez undefined, vous écrivez simplement return;
  3. Lors de l'appel d'une fonction, vous ne pouvez pas dire (en code) si l'exécution est tombée à la fin et s'est terminée par return;, ou terminé par return undefined;; ils ont tous exactement le même aspect que votre code d'appel

Concernant la spécification: spécifiquement, lorsque l'exécution d'une fonction échoue, cette spécification constitue un achèvement "normal"; mais return; et return value; sont à la fois des "retours" complets avec une valeur associée (undefined), ce 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 dit:

...

  1. Si résultat. [[Type]] est return, retourne NormalCompletion ( résultat. [[Valeur]]).
  2. ReturnIfAbrupt ( résultat).
  3. Retourne NormalCompletion ( non défini ).

Donc, il n'y a aucune différence que vous pouvez observer dans le code.

4
T.J. Crowder

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

2
mohkhan