Sortie prématurée de la fonction?

402

J'ai une fonction:

function myfunction() {
  if (a == 'stop')  // How can I stop the function here?
}

Y a-t-il quelque chose comme exit()en JavaScript?

Simon
la source
4
voulez-vous arrêter l'exécution ou revenir?
Ken Struys
@Ken Struys quelle est la différence? si je comprends bien, si je fais le retour, cela arrête l'exécution? n'est-ce pas?
Simon
3
Eh bien, voici la chose, l'utilisation d'un retour reviendra simplement au contexte de la fonction d'appel. Si vous voulez réellement la sémantique de sortie que vous voulez arrêter l'exécution, vous pouvez faire quelque chose comme ceci: vikku.info/codesnippets/javascript/…
Ken Struys
1
@Ken - Ce lien que vous avez fourni traite de l'arrêt de l'exécution d'une forboucle. Même alors, je n'ai aucune idée de la raison pour laquelle la méthode suggérée serait utilisée, alors que vous pourriez simplement appeler break;. Pour utiliser l'exemple de l'article: L' if(i==5) break;utilisation returninterrompra l'exécution de la fonction, que vous soyez ou non dans une forboucle.
user113716
Syom - Oui, returnarrêtera l'exécution de la fonction, ce qui semble être ce que vous avez demandé.
user113716

Réponses:

639

Vous pouvez simplement utiliser return.

function myfunction() {
     if(a == 'stop') 
         return;
}

Cela enverra une valeur de retour de undefinedce qui a appelé la fonction.

var x = myfunction();

console.log( x );  // console shows undefined

Bien sûr, vous pouvez spécifier une valeur de retour différente. Quelle que soit la valeur retournée, elle sera enregistrée dans la console à l'aide de l'exemple ci-dessus.

return false;
return true;
return "some string";
return 12345;
user113716
la source
4
Je sais que c'est un ancien poste, et c'est une pratique courante MAIS je pense que c'est une mauvaise solution. Si la fonction est SUPPOSÉE pour renvoyer une valeur, vous devez utiliser return. Si vous utilisez simplement aveuglément return, vous pourriez rencontrer des problèmes plus tard. Surtout si vous commencez à lier des événements qui ont un retour. Consultez cet article pour plus d'informations: fuelyourcoding.com/jquery-events-stop-misusing-return-false
64
@dbme: les fonctions en JavaScript reviennent toujours . L'instruction return est implicite si elle n'a pas été fournie. La valeur de retour par défaut est undefined, et c'est ce que fournit ma solution principale. L'article return falseauquel vous avez fait référence parle de faire dans un gestionnaire d'événements jQuery. C'est une question entièrement différente. C'est la bonne façon de quitter une fonction JavaScript. Évidemment, si l'appelant s'appuie sur la valeur renvoyée, la valeur doit être définie de manière appropriée.
user113716
3
... Une variation implicite serait if(a != 'stop') { /* run my code */ }que le code ne s'exécute que lorsque an'est pas égal 'stop'sans fournir d'explicite return. Mais la valeur de retour est identique à ma solution . Dans les deux cas, undefinedsera retourné.
user113716
3
Réponse impressionnante. Je ne savais pas qu'il y avait une différence entre renvoyer undefined vs false vs une valeur différente. J'essaie de trouver une réponse définitive concernant ce comportement depuis une heure. Est-il donc sûr de dire (pour réitérer votre point) que le retour est un moyen sûr à 100% de quitter une méthode, même si l'appelant est lié à des événements, etc.?
@dbme: Eh bien, tout dépend de ce qui est attendu par la méthode appelant la fonction. Si une bibliothèque de codes définit un système d'événements qui se cassera s'il reçoit undefined(ou s'il ne reçoit pas une autre valeur) comme valeur de retour, alors vous devrez vous conformer aux spécifications de cette API et renvoyer la valeur correcte. Généralement, pour un système de gestion d'événements, il attendra undefinedcomme une simple indication que le gestionnaire a terminé, et il n'y a pas d'autres instructions. Avec jQuery, return false;a une signification particulière donnant l'instruction de faire un preventDefaultet stopPropagation.
user113716
49

Apparemment, vous pouvez le faire:

function myFunction() {myFunction:{
    console.log('i get executed');
    break myFunction;
    console.log('i do not get executed');
}}

Voir les étendues de bloc grâce à l'utilisation d'une étiquette: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label

Je ne vois encore aucun inconvénient. Mais cela ne semble pas être une utilisation courante.

Dérivé de cette réponse: équivalent JavaScript du dé de PHP

CMCDragonkai
la source
est-il possible d'utiliser cette solution avec le module exports nodejs? quand je l'essaye j'obtiens l'erreur "étiquette non utilisée". exports.MyFunction = function (data) {myFunction: {break myFunction;}}
Yuri Almeida
20
function myfunction() {
     if(a == 'stop') 
         return false;
}

return false; est bien mieux que juste return;

xlaok
la source
13
Pourquoi est-ce falsemieux? Je dirais que la valeur par défaut undefinedest meilleure dans le cas générique. Quoi qu'il en soit, vous avez raison de dire qu'il est souvent préférable de renvoyer une valeur significative.
Brad Koch
Cela dépend du programmeur et dépend du cas d'utilisation. Par exemple, une fonction peut valider quelque chose, donc si la validation échoue, il est plus logique de retourner falseque undefined.
Adam McArthur
18

Cette:

function myfunction()
{
     if (a == 'stop')  // How can I stop working of function here?
     {
         return;
     }
}
Rob
la source
11

En utilisant une approche légèrement différente, vous pouvez utiliser try catch, avec une instruction throw.

function name() {
    try {
        ...

        //get out of here
        if (a == 'stop')
            throw "exit";

        ...
    } catch (e) {
        // TODO: handle exception
    }
}
Rodney Salcedo
la source
3

si vous recherchez un script pour éviter de soumettre un formulaire lorsque des erreurs sont détectées, cette méthode devrait fonctionner

function verifyData(){
     if (document.MyForm.FormInput.value.length == "") {
          alert("Write something!");
     }
     else {
          document.MyForm.submit();
     }
}

changer le type de bouton Soumettre en "bouton"

<input value="Save" type="button" onClick="verifyData()">

j'espère que cette aide.

Awal Istirdja
la source
2

L'utilisation d'un returnarrêtera la fonction et retournera undefined, ou la valeur que vous spécifiez avec la commande de retour.

function myfunction(){
    if(a=="stop"){
        //return undefined;
        return; /** Or return "Hello" or any other value */
    }
}
Seizefire
la source
1

Je n'aime pas répondre à des choses qui ne sont pas une vraie solution ...

... mais quand j'ai rencontré ce même problème, j'ai fait ci-dessous une solution de contournement:

function doThis() {
  var err=0
  if (cond1) { alert('ret1'); err=1; }
  if (cond2) { alert('ret2'); err=1; }
  if (cond3) { alert('ret3'); err=1; }
  if (err < 1) {
    // do the rest (or have it skipped)
  }
}

J'espère que cela peut être utile à n'importe qui.

Leo
la source
Duh. C'est tellement simple que je n'y ai jamais pensé !! Assez utile pour éviter les gros IF imbriqués. Merci.
Debbie A
Ce serait mieux avec un interrupteur.
bdelmas
Cela dépend si vous souhaitez avoir toutes les alertes d'erreur en même temps, ou en être informé d'une seule. Cependant, chaque condition doit être exécutée de toute façon.
Leo
0

Je pense que jeter une nouvelle erreur est une bonne approche pour arrêter l'exécution plutôt que de simplement retourner ou retourner false. Par exemple. Je valide un certain nombre de fichiers que je n'autorise que cinq fichiers maximum à télécharger dans une fonction distincte.

validateMaxNumber: function(length) {
   if (5 >= length) {
        // Continue execution
   }
   // Flash error message and stop execution
   // Can't stop execution by return or return false statement; 
   let message = "No more than " + this.maxNumber + " File is allowed";
   throw new Error(message);
}

Mais j'appelle cette fonction de la fonction de flux principale comme

  handleFilesUpload() {
      let files =  document.getElementById("myFile").files;
      this.validateMaxNumber(files.length);
}

Dans l'exemple ci-dessus, je ne peux pas arrêter l'exécution à moins que je ne lance une nouvelle erreur.

Bedram Tamang
la source
-3

sortie(); peut être utilisé pour passer à la prochaine validation.

Chirag Dineshbhai Ponda
la source
-4

Si vous utilisez jquery. Cela devrait empêcher la fonction de se propager jusqu'à ce que la fonction parent qui l'appelle devrait également s'arrêter.

  function myfunction(e)
  {
       e.stopImmediatePropagation();
       ................
  }
silvster27
la source
6
stopImmediatePropagation()n'est pas une chose jQuery, et arrêter la propagation n'est pas la même chose que quitter une fonction.
Brad Koch
-13

tapez n'importe quelle commande aléatoire qui génère une erreur, par exemple:

exit

ou

die:-)
amrali
la source
Cela peut empêcher l'exécution de tout le code, pas seulement le reste de la fonction. Check fiddle: jsfiddle.net/b3k0xo7n/1
treecon
1
Quelle terrible approche de programmation. Comment est-ce intuitif pour un autre développeur qui travaille sur la même base de code?
osullique