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?

Simon
quelle
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;
user113716
quelle
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

CMCDragonkai
quelle
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;

xlaok
quelle
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;
     }
}
rauben
quelle
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
    }
}
Rodney Salcedo
quelle
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.

Awal Istirdja
quelle
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 */
    }
}
Seizefire
quelle
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.

Löwe
quelle
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.

Bedram Tamang
quelle
-3

Ausfahrt(); kann verwendet werden, um für die nächste Validierung zu gehen.

Chirag Dineshbhai Ponda
quelle
-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();
       ................
  }
silvster27
quelle
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:-)
Amrali
quelle
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