Czy powrót zatrzymuje pętlę?


157

Załóżmy, że mam taką pętlę:

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

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

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

Szybkie pytanie: czy returnsamoczynnie wstrzymuje wykonywanie pętli?

Odpowiedzi:


206

Tak, returnzatrzymuje wykonywanie i wychodzi z funkcji. returnalways ** natychmiast kończy swoją funkcję, bez dalszego wykonywania, jeśli znajduje się w pętli for.

Można to łatwo zweryfikować samodzielnie:

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

alert(returnMe());
// 1

** Uwagi: Zobacz tę inną odpowiedź dotyczącą specjalnego przypadku funkcji, try/catch/finally a ta odpowiedź dotycząca tego, jak pętle forEach mają swój własny zakres funkcji, nie wyłamie się z funkcji zawierającej.


25
> return zawsze kończy swoją funkcję natychmiast, bez dalszego wykonywania, jeśli znajduje się w pętli ... chyba że jest to pętla forEach
oo

9
@oo Prawda. returnnadal wraca z bieżącej iteracji funkcji zwrotnej w swoim własnym zakresie, ale nie oczekuje się, że przerwie działanie całej metody wywołującej forEach(). Więc nie wraca z samej pętli , ale wraca z wywołania zwrotnego wykonywanego przez pętlę. W przykładzie kodu z pytania połączonego dane wyjściowe 1,2,4,5pomijają przyczynę 3zwrotu.
Michael Berkowski

Może czerwona nić jest taka, returnże zawsze wróci z obecnego thiskontekstu.
oo

Alternatywą dla użycia forEach () lub for () na tablicy w celu „potencjalnie” wczesnego zakończenia pętli jest użycie some ().
AnBisw,

1
Wiem, że to banalne dla niektórych ludzi, ale to jest tak dobre, wiem, bo nie masz już na breakczym return.
NoName

60

W większości przypadków (w tym ten), returnzakończy się natychmiast. Jeśli jednak powrót znajduje się w trybloku z towarzyszącym mu finallyblokiem, finallyzawsze wykonuje i może „przesłonić” znak returnw 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

returnOświadczenie zatrzymuje pętlę tylko jeśli jest wewnątrz funkcji. W przeciwnym razie pojawi się ten błąd:

Uncaught SyntaxError: Illegal return statement(…)

6

Ten kod zakończy pętlę po pierwszej iteracji w for ofpętli:

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

poniższy kod wskoczy na warunek i będzie kontynuowany w for ofpętli:

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

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

Dzięki, bardzo mi to pomogło, używam węzła i zwrot niszczy mój dla, dla każdego i dla ... z, kontynuacja działa tak, jak się spodziewałem
veroneseComS

5

Tak, kiedyś return instrukcji cała funkcja zostaje zakończona w tym momencie.

Wyobraź sobie, co by się stało, gdyby tak się nie stało i kontynuował zapętlanie i wykonywanie tego returnpolecenia za każdym razem? Unieważniłoby to znaczenie zwracania wartości, kiedy o tym myślisz.


1

Odpowiedź brzmi: tak, jeśli napiszesz instrukcję return, kontrolka natychmiast wróci do metody wywołującej. Z wyjątkiem ostatniego bloku, który jest wykonywany po instrukcji return.

i wreszcie może również przesłonić wartość, którą zwróciłeś, jeśli wrócisz do wnętrza ostatniego bloku. POŁĄCZYĆ: Wyjaśnienie dotyczące try-catch-last-return

Definicja instrukcji zwrotu zgodnie z:

Dokumenty Java:

instrukcja return może służyć do odgałęzienia się z bloku przepływu sterowania i wyjścia z metody

Dokumentacja MSDN:

Instrukcja return przerywa wykonywanie funkcji i zwraca kontrolę do funkcji wywołującej. Wykonywanie zostaje wznowione w funkcji wywołującej w punkcie bezpośrednio po wywołaniu.

Wikipedia:

Instrukcja return powoduje, że wykonanie opuszcza bieżący podprogram i wznawia działanie w punkcie kodu bezpośrednio po wywołaniu podprogramu, znanym jako jego adres zwrotny. Adres zwrotny jest zapisywany, zwykle na stosie wywołań procesu, jako część operacji wykonywania wywołania podprogramu. Instrukcje Return w wielu językach umożliwiają funkcji określenie wartości zwracanej, która ma być przekazana z powrotem do kodu, który wywołał funkcję.


Musisz odpowiednio połączyć źródła, z których korzystałeś, i najlepiej sformatować również cytaty.
Nathan Tuggy

czy to teraz wygląda dobrze?
user1179299

Doceniam poprawki gramatyczne, ale nadal nie ma żadnych linków, a ty nadal nie używasz formatowania cytatów blokowych.
Nathan Tuggy

0

„return” nie wychodzi z funkcji, ale jeśli chcesz zwrócić duże sumy danych, możesz zapisać je w tablicy, a następnie zwrócić, zamiast próbować zwracać każdy fragment danych w pętli 1 na 1.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.