Vorzeitiger Funktionsabbruch?


402

Ich habe eine Funktion:

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

Gibt es so etwas wie exit()in JavaScript?


4
Möchten Sie die Ausführung stoppen oder zurückkehren?
Ken Struys

@ Ken Struys was ist der Unterschied? Wie ich verstehe, stoppt es die Ausführung, wenn ich zurückkehre? ist es nicht?
Simon

3
Nun, hier ist die Sache: Wenn Sie eine Rückgabe verwenden, kehren Sie einfach zum Kontext der aufrufenden Funktion zurück. Wenn Sie tatsächlich die Exit-Semantik möchten, die Sie beenden möchten, können Sie Folgendes
Ken Struys

1
@ Ken - Der von Ihnen bereitgestellte Link befasst sich mit dem Stoppen der Ausführung einer forSchleife. Selbst dann habe ich keine Ahnung, warum die vorgeschlagene Methode verwendet werden würde, wenn Sie nur aufrufen könnten break;. So verwenden Sie das Beispiel aus dem Artikel: if(i==5) break;Mit returnwird die Ausführung der Funktion angehalten, unabhängig davon, ob Sie sich in einer forSchleife befinden oder nicht .
user113716

Syom - Ja, returnstoppt die Ausführung der Funktion, wie Sie es gefragt haben.
user113716

Antworten:


639

Sie können einfach verwenden return.

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

Dies sendet einen Rückgabewert von undefinedan die Funktion.

var x = myfunction();

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

Natürlich können Sie einen anderen Rückgabewert angeben. Der zurückgegebene Wert wird anhand des obigen Beispiels in der Konsole protokolliert.

return false;
return true;
return "some string";
return 12345;

4
Ich weiß, dass dies ein alter Beitrag ist, und dies ist gängige Praxis, ABER ich denke, dies ist eine schlechte Lösung. Wenn die Funktion einen Wert zurückgeben soll, sollten Sie return verwenden. Wenn Sie return nur blind verwenden, können später Probleme auftreten. Vor allem, wenn Sie Ereignisse binden, die eine Rückgabe enthalten. Weitere Informationen finden Sie in diesem Beitrag: fuelyourcoding.com/jquery-events-stop-misusing-return-false

64
@dbme: Funktionen in JavaScript werden immer zurückgegeben. Die return-Anweisung ist implizit, wenn sie nicht angegeben wurde. Der Standardrückgabewert ist undefined, und das bietet meine primäre Lösung. In dem Artikel, auf den Sie verwiesen haben, geht es um die Ausführung return falsein einem jQuery-Ereignishandler. Das ist ein ganz anderes Thema. Dies ist der richtige Weg, um eine JavaScript-Funktion zu beenden. Wenn sich der Anrufer auf den zurückgegebenen Wert verlässt, muss der Wert natürlich entsprechend definiert werden.
user113716

3
... Eine implizite Variation wäre, if(a != 'stop') { /* run my code */ }dass der Code nur ausgeführt wird, wenn er anicht gleich ist, 'stop'ohne eine explizite Angabe zu machen return. Der Rückgabewert ist jedoch identisch mit meiner Lösung . In beiden Fällen undefinedwird zurückgegeben.
user113716

3
Tolle Antwort. Ich wusste nicht, dass es einen Unterschied zwischen der Rückgabe von undefiniert und falsch und einem anderen Wert gibt. Ich habe in der letzten Stunde versucht, eine endgültige Antwort auf dieses Verhalten zu finden. Ist es also sicher zu sagen (um Ihren Standpunkt zu wiederholen), dass die Rückgabe eine 100% sichere Möglichkeit ist, eine Methode zu beenden, selbst wenn der Aufrufer an Ereignisse usw. gebunden ist?

@dbme: Nun, es hängt alles davon ab, was von der Methode erwartet wird, die die Funktion aufruft. Wenn eine Codebibliothek ein Ereignissystem definiert, das beschädigt wird, wenn es undefinedeinen Rückgabewert empfängt (oder keinen anderen Wert erhält), müssen Sie die Spezifikation dieser API einhalten und den richtigen Wert zurückgeben. Im Allgemeinen wird für ein Ereignisbehandlungssystem undefinedals einfacher Hinweis erwartet , dass der Handler fertig ist, und es gibt keine weiteren Anweisungen. Hat mit jQuery return false;eine besondere Bedeutung und gibt Anweisungen, um ein preventDefaultund zu tun stopPropagation.
user113716

49

Anscheinend können Sie dies tun:

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

Siehe Blockbereiche mithilfe eines Labels: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label

Ich kann noch keine Nachteile erkennen. Aber es scheint keine übliche Verwendung zu sein.

Abgeleitet diese Antwort: JavaScript-Äquivalent von PHPs Würfel


Ist es möglich, diese Lösung mit dem Exportmodul von nodejs zu verwenden? Wenn ich es versuche, erhalte ich den Fehler "nicht verwendetes Etikett". exports.MyFunction = Funktion (Daten) {myFunction: {break myFunction;}}
Yuri Almeida

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

return false; ist viel besser als nur return;


13
Warum ist falsebesser? Ich würde sagen, der Standard undefinedist im generischen Fall besser. In jedem Fall sagen Sie zu Recht, dass es oft besser ist, einen aussagekräftigen Wert zurückzugeben.
Brad Koch

Es liegt am Programmierer und hängt vom Anwendungsfall ab. Beispielsweise kann eine Funktion etwas validieren. Wenn die Validierung fehlschlägt, ist es sinnvoller, falseals zurückzukehren undefined.
Adam McArthur

18

Diese:

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

11

Mit einem etwas anderen Ansatz können Sie try catchmit throw-Anweisung verwenden.

function name() {
    try {
        ...

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

        ...
    } catch (e) {
        // TODO: handle exception
    }
}

3

Wenn Sie nach einem Skript suchen, um das Senden von Formularen zu vermeiden, wenn Fehler gefunden werden, sollte diese Methode funktionieren

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

Ändern Sie den Typ der Schaltfläche " Senden " in "Schaltfläche".

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

Ich hoffe das hilft.


2

Die Verwendung von a returnstoppt die Funktion und gibt zurück undefinedoder den Wert, den Sie mit dem Befehl return angeben.

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

1

Ich mag es nicht, Dinge zu beantworten, die keine echte Lösung sind ...

... aber als ich auf dasselbe Problem stieß, habe ich die folgende Problemumgehung durchgeführt:

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)
  }
}

Hoffe, es kann für jeden nützlich sein.


Duh. Das ist so einfach, dass ich nie daran gedacht habe !! Ziemlich nützlich, um große verschachtelte IFs zu vermeiden. Vielen Dank.
Debbie A

Dies wäre besser mit einem Schalter.
bdelmas

Hängt davon ab, ob Sie alle Fehlerwarnungen auf einmal erhalten möchten oder nur über eine benachrichtigt werden möchten. Jede Bedingung muss jedoch trotzdem ausgeführt werden.
Leo

0

Ich denke, ein neuer Fehler ist ein guter Ansatz, um die Ausführung zu stoppen, anstatt nur return oder false zurückzugeben. Zum Beispiel. Ich überprüfe eine Reihe von Dateien, bei denen ich nur maximal fünf Dateien zum Hochladen in einer separaten Funktion zulasse.

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);
}

Aber ich rufe diese Funktion von der Hauptflussfunktion als auf

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

Im obigen Beispiel kann ich die Ausführung nur stoppen, wenn ich einen neuen Fehler auslöse. Nur return oder return false funktioniert nur, wenn Sie sich in der Hauptfunktion der Ausführung befinden, andernfalls funktioniert es nicht.



-4

Wenn Sie jquery verwenden. Dies sollte verhindern, dass die Funktion sprudelt, sodass die übergeordnete Funktion, die dies aufruft, ebenfalls stoppt.

  function myfunction(e)
  {
       e.stopImmediatePropagation();
       ................
  }

6
stopImmediatePropagation()ist keine jQuery-Sache, und das Stoppen der Weitergabe ist nicht dasselbe wie das Beenden einer Funktion.
Brad Koch

-13

Geben Sie einen beliebigen Befehl ein, der einen Fehler auslöst. Beispiel:

exit

oder

die:-)

Dies kann verhindern, dass der gesamte Code ausgeführt wird, nicht nur der Rest der Funktion. Überprüfen Sie die Geige: jsfiddle.net/b3k0xo7n/1
treecon

1
Was für ein schrecklicher Programmieransatz. Wie ist dies für einen anderen Entwickler intuitiv, der an derselben Codebasis arbeitet?
Osullic
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.