Stoppt return eine Schleife?


156

Angenommen, ich habe eine Schleife wie diese:

for (var i = 0; i < SomeArrayOfObject.length; i++) {

  if (SomeArray[i].SomeValue === SomeCondition) {

     var SomeVar = SomeArray[i].SomeProperty;
     return SomeVar;
  }
}

Kurze Frage: Stoppt das returndie Ausführung der Schleife an und für sich?

Antworten:


205

Ja, returnstoppt die Ausführung und beendet die Funktion. returnImmer ** beendet seine Funktion sofort und ohne weitere Ausführung, wenn es sich in einer for-Schleife befindet.

Es ist leicht für sich selbst zu überprüfen:

function returnMe() {
  for (var i=0; i<2; i++) {
    if (i === 1) return i;
  }
}

alert(returnMe());
// 1

** Hinweise: Siehe diese andere Antwort zum Sonderfall von try/catch/finally und diese Antwort darüber, wie forEach-Schleifen einen eigenen Funktionsumfang haben, bricht nicht aus der enthaltenen Funktion aus.


25
> return beendet seine Funktion immer sofort, ohne weitere Ausführung, wenn es sich in einer Schleife befindet ... es sei denn, es ist eine forEach-Schleife
oo

9
@oo Irgendwie wahr. returnkehrt immer noch von der aktuellen Iteration des Funktionsrückrufs in seinem eigenen Bereich zurück, es ist jedoch nicht zu erwarten, dass die gesamte aufrufende Methode unterbrochen wird forEach(). Es kehrt also nicht von der Schleife selbst zurück , sondern von dem Rückruf, den die Schleife ausführt. Im Codebeispiel aus der verknüpften Frage 1,2,4,5überspringt die Ausgabe die 3wegen der Rückgabe.
Michael Berkowski

Vielleicht ist der rote Faden, dass returnimmer aus dem aktuellen thisKontext zurückkehren wird.
oo

Die Alternative zur Verwendung von forEach () oder for () in einem Array für die „potenziell“ frühe Schleifenbeendigung ist die Verwendung von some ().
AnBisw

1
Ich weiß, dass dies für manche Menschen trivial ist, aber das ist so gut zu wissen, weil Sie es nicht mehr müssen breakund dann return.
NoName

60

In den meisten Fällen (einschließlich diesem) returnwird sofort beendet. Befindet sich die Rückgabe jedoch in einem tryBlock mit einem zugehörigen finallyBlock, wird der finallyimmer ausgeführt und kann den returnin der "überschreiben" try.

function foo() {
    try {
        for (var i = 0; i < 10; i++) {
            if (i % 3 == 0) {
                return i; // This executes once
            }
        }
    } finally {
        return 42; // But this still executes
    }
}

console.log(foo()); // Prints 42

8

Die returnAnweisung stoppt eine Schleife nur, wenn sie sich innerhalb der Funktion befindet. Andernfalls wird folgende Fehlermeldung angezeigt:

Uncaught SyntaxError: Illegal return statement(…)

6

Dieser Code verlässt die Schleife nach der ersten Iteration in einer for ofSchleife:

const objc = [{ name: 1 }, { name: 2 }, { name: 3 }];
for (const iterator of objc) {
  if (iterator.name == 2) {
    return;
  }
  console.log(iterator.name);// 1
}

Der folgende Code springt auf die Bedingung und setzt eine for ofSchleife fort:

const objc = [{ name: 1 }, { name: 2 }, { name: 3 }];

for (const iterator of objc) {
  if (iterator.name == 2) {
    continue;
  }
  console.log(iterator.name); // 1  , 3
}

Vielen Dank, das hilft mir sehr, ich benutze Node und die Rückkehr bricht meine für, für und für ... von, die Fortsetzung funktioniert wie ich erwartet hatte
veroneseComS

5

Ja, sobald die returnAnweisung ausgeführt wurde, wird die gesamte Funktion genau an diesem Punkt beendet.

Stellen Sie sich vor, was passieren würde, wenn dies nicht der Fall wäre und die Schleife fortgesetzt und diese returnAnweisung jedes Mal ausgeführt würde. Dies würde die Bedeutung der Rückgabe eines Werts ungültig machen, wenn Sie darüber nachdenken.


1

Die Antwort lautet Ja. Wenn Sie eine return-Anweisung schreiben, kehren die Steuerelemente sofort zur Aufrufer-Methode zurück. Mit Ausnahme von finally block, das nach der return-Anweisung ausgeführt wird.

und kann schließlich auch den zurückgegebenen Wert überschreiben, wenn Sie innerhalb des finally-Blocks zurückkehren. LINK: Klärung versuchen, endlich zurückkehren

Definition der Rückgabeanweisung gemäß:

Java Docs:

Eine return-Anweisung kann verwendet werden, um aus einem Kontrollflussblock zu verzweigen und die Methode zu beenden

MSDN-Dokumentation:

Die return-Anweisung beendet die Ausführung einer Funktion und gibt die Steuerung an die aufrufende Funktion zurück. Die Ausführung wird in der aufrufenden Funktion an dem Punkt unmittelbar nach dem Aufruf fortgesetzt.

Wikipedia:

Eine return-Anweisung bewirkt, dass die Ausführung das aktuelle Unterprogramm verlässt und an der Stelle im Code fortgesetzt wird, die unmittelbar nach dem Aufruf des Unterprogramms liegt, das als Rücksprungadresse bezeichnet wird. Die Rücksprungadresse wird normalerweise im Aufrufstapel des Prozesses als Teil der Operation zum Ausführen des Unterprogrammaufrufs gespeichert. Rückgabeanweisungen in vielen Sprachen ermöglichen es einer Funktion, einen Rückgabewert anzugeben, der an den Code zurückgegeben werden soll, der die Funktion aufgerufen hat.


Sie müssen die von Ihnen verwendeten Quellen ordnungsgemäß verknüpfen und im Idealfall auch die Anführungszeichen formatieren.
Nathan Tuggy

sieht das jetzt gut aus
user1179299

Ich schätze die Grammatikkorrekturen, aber es gibt immer noch keine Links und Sie verwenden immer noch keine Blockquote-Formatierung.
Nathan Tuggy

0

"return" beendet die Funktion zwar, aber wenn Sie große Datensummen zurückgeben möchten, können Sie diese in einem Array speichern und dann zurückgeben, anstatt zu versuchen, jedes Datenelement 1 zu 1 in der Schleife zurückzugeben.

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.