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?

frenchie
quelle

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.

Michael Berkowski
quelle
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
John Girata
quelle
8

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

Uncaught SyntaxError: Illegal return statement(…)
Damjan Pavlica
quelle
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
}
PersianIronwood
quelle
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.

Keldon Alleyne
quelle
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.

user1179299
quelle
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.

Brendon McBain
quelle