Chaque fonction Javascript doit-elle renvoyer une valeur?


99

J'utilise Netbeans pour ajouter des commentaires de type professionnel à chaque fonction, j'écris. Je commence donc chacun d'eux par /**, puis j'appuie sur Enterpour laisser Netbeans remplir le schéma de commentaires par défaut pour la fonction suivante.

Jusqu'à présent, je n'utilisais cela que pour le langage PHP et dans ce cas, Netbeans ajoutait toujours une @returns {type}partie dans le schéma de commentaire uniquement, si la fonction PHP suivante incluait vraiment une returndéclaration. Sur les soi-disant «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 a ajouté une @returns {undefined}partie au schéma de commentaire même si la fonction suivante ne renvoie rien.

Cela m'a dérouté. Netbeans suggère-t-il ainsi que chaque fonction Javascript doit renvoyer quelque chose? Que devrais-je faire? Ignorer (ou supprimer) cette partie du schéma de commentaire ou suivre la suggestion (si c'est une suggestion) et ajouter return false;à la fin de cette fonction, bien que cela ne me serve à rien?


6
Si aucune valeur de retour n'est spécifiée, JavaScript retournera undefined. Dans de nombreuses langues, le résultat de la dernière déclaration est renvoyé (plus utile, IMO). Celles-ci sont appelées retours implicites .
Zaz

Réponses:


189

La réponse courte est non.

La vraie réponse est oui: le moteur JS doit être notifié qu'une fonction a terminé son activité, ce qui est fait par la fonction renvoyant quelque chose. C'est aussi pourquoi, au lieu de «terminé» , une fonction est dite «retournée» .
Une fonction qui n'a pas d'instruction de retour explicite retournera undefined, comme une fonction C (++) qui n'a pas de valeur de retour est dite (et sa signature le reflète) pour retourner 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, dans JS, comme dans la plupart des langages, vous êtes libre d'ignorer simplement la valeur de retour d'une fonction, ce qui est énormément fait:

(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 niveau très bas, le retour se traduit par une sorte de saut. Si une fonction ne renvoie vraiment rien du tout, il n'y aurait aucun moyen de savoir quoi et quand appeler la fonction suivante, ou d'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 en ce qui concerne votre code. Mais en ce qui concerne les moteurs JS: une fonction renvoie toujours quelque chose, que ce soit explicitement via une returninstruction, ou implicitement. Si une fonction retourne implicitement, sa valeur de retour sera toujours indéfinie.


5
Je ne crois pas que C ++ (ou C) "renvoie un vide". La balise "void" indique qu'elle ne renvoie rien. C'est un point mineur cependant et n'a rien à voir avec la question posée.
Jay

2
Il ne retourne pas réellementvoid , il ne renvoie rien, mais sa signature reflète cela à travers le voidtype de retour.
Elias Van Ootegem

Y a-t-il des avantages de performance pour un retour explicite par rapport à un rendement implicite?
4m1r

@ 4m1r: Je ne sais pas, cela dépend probablement du moteur. S'il y a une différence de performance, il est fort probable qu'elle soit négligeable. le retour implicite vs return;n'est probablement utile que si vous devez revenir plus tôt. l'écriture return undefined;peut produire des résultats différents si undefinedelle se résout à une valeur différente. La plupart des navigateurs (sinon tous) généreront une erreur lorsque vous tenterez de réaffecter undefined, mais en théorie, il est possible que voici un exemple utilisant node.js
Elias Van Ootegem

1
@SebastianLasse: Je faisais référence à voidd'autres langages (comme C), où vous pouvez avoir des fonctions comme void do_someting(int *arg), mais vous ne pouvez pas avoir de variable avec le type void. En C, ce voidn'est pas vraiment un type, donc ces fonctions ne renvoient rien, elles sautent juste
Elias Van Ootegem

26

Non, le retour n'est pas nécessaire.

Mais aucun retour ne retourne leundefined


6

Chaque fonction Javascript doit-elle renvoyer une valeur?

Non, ils ne le font pas. Il est vrai qu'au fond de la spécification, ceux-ci sont tous légèrement différents:

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

... mais le résultat de l' appel chacun d'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, en particulier, vous venez d'écrirereturn;
  3. Lors de l'appel d'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 s'est terminée par return undefined;; ils ont tous exactement la même apparence à votre code d'appel

Concernant la spécification: plus précisément, lorsque l'exécution d'une fonction tombe à la fin, dans la spécification, c'est un achèvement "normal"; mais return;etreturn value; sont tous deux des "retournements" complets avec une valeur associée ( undefined), qui est (très légèrement) différente. Mais la différence est éliminée par la sémantique de l' appel d'une fonction , qui dit:

...

  1. Si résultat . [[Type]] estreturn , renvoie NormalCompletion ( result . [[Value]]).
  2. ReturnIfAbrupt ( résultat ).
  3. Retourne NormalCompletion ( undefined ).

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


2

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

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.