Dönüş bir döngüyü durdurur mu?


157

Diyelim ki böyle bir döngü var:

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

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

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

Hızlı soru: return Döngünün kendi içinde ve kendi başına yürütülmesini durdurur mu?

Yanıtlar:


206

Evet, returnyürütmeyi durdurur ve işlevden çıkar.returnher zaman ** işlevini derhal terk eder, for döngüsü içerisindeyse başka bir işlem yapılmaz.

Kendiniz için kolayca doğrulanır:

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

alert(returnMe());
// 1

** Notlar: Özel durumla ilgili bu diğer yanıta bakın try/catch/finally ve forEach döngülerinin kendi işlev kapsamına nasıl sahip olduğu hakkındaki bu cevap içeren işlevden kopmayacaktır.


25
> return her zaman işlevinden hemen çıkar, bir döngü içinde ise başka bir işlem yapılmaz ... forEach döngüsü olmadıkça
oo

9
@oo Tür doğru. returnyine de, kendi kapsamı içinde, işlev geri aramasının geçerli yinelemesinden döner, ancak tüm çağrı yönteminden kopması beklenmez forEach(). Yani döngünün kendisinden dönmüyor , ancak döngünün yürüttüğü geri çağrıdan dönüyor. Bağlantılı sorudan kod örneğinde, çıktı dönüş nedeniyle 1,2,4,5atlıyor 3.
Michael Berkowski

Belki kırmızı iplik returnher zaman geçerli thisbağlamdan dönecektir .
oo

“Potansiyel” erken döngü sonlandırma için bir dizide forEach () veya for () kullanmanın alternatifi some () kullanmaktır.
AnBisw

1
Bunun bazı insanlar için önemsiz olduğunu biliyorum, ama bu çok iyi biliyorum çünkü artık break ve sonrareturn .
NoName

60

İçinde çoğu (bu dahil) durumlarda, returnhemen çıkılacak. Dönüşü ise Bununla birlikte, tryeşlik eden blokta finallyblok, finallyher zaman ve her can "geçersiz" yürütür returniçinde 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

returnİfadesi bu fonksiyonun içeride yalnızca bir döngü durur. Aksi takdirde, bu hatayı alırsınız:

Uncaught SyntaxError: Illegal return statement(…)

6

Bu kod, bir for ofdöngüdeki ilk yinelemeden sonra döngüden çıkar:

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

Aşağıdaki kod koşula atlar ve bir for ofdöngüde devam eder :

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

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

Teşekkürler, bu bana çok yardımcı, düğüm kullanıyorum ve dönüş her biri için ... için, benim beklediğim gibi devam ediyor
veroneseComS

5

Evet, return ifade yürütüldükten sonra, tüm fonksiyon bu noktadan çıkar.

Sadece olmasaydı ve döngü yapmaya devam edip returnher seferinde bu ifadeyi yürütmeye devam ederse ne olacağını hayal edin. Düşündüğünüzde bir değer döndürmenin anlamı geçersiz olur.


1

Cevap evet, eğer return ifadesi yazarsanız kontroller hemen arayan yönteme geri döner. Dönüş ifadesinden sonra yürütülen nihayet bloğu hariç.

ve son olarak bloğun içine dönerseniz, döndürdüğünüz değeri de geçersiz kılabilir. LINK: Try-catch-nihayet-dönüş açıklaması

Aşağıdaki gibi İade Beyanı tanımı:

Java Belgeleri:

bir dönüş ifadesi bir kontrol akış bloğundan dallanmak ve yöntemden çıkmak için kullanılabilir

MSDN Belgeleri:

Return ifadesi bir işlevin yürütülmesini sonlandırır ve denetimi çağrı işlevine döndürür. Yürütme, çağrıyı hemen takip eden noktada çağrı işlevinde devam eder.

Wikipedia:

Bir return deyimi, yürütmenin geçerli altyordamdan ayrılmasına ve altyordamın dönüş adresi olarak bilinen altyordamın çağrılmasından hemen sonra kodda devam etmesine neden olur. Dönüş adresi, alt program çağrısını yapma işleminin bir parçası olarak, genellikle sürecin çağrı yığınına kaydedilir. Birçok dilde döndürme ifadeleri, bir işlevin, işlevi çağıran koda geri döndürülmesini belirtmesine izin verir.


Kullandığınız kaynakları uygun şekilde bağlamanız ve ideal olarak tırnak işaretlerini biçimlendirmeniz gerekir.
Nathan Tuggy

şimdi iyi görünüyor mu?
user1179299

Dilbilgisi düzeltmelerini takdir ediyorum, ancak yine de herhangi bir bağlantı yok ve hala blok alıntı biçimlendirmesi kullanmıyorsunuz.
Nathan Tuggy

0

"return" işlevi işlevden çıkar, ancak büyük miktarda veri döndürmek istiyorsanız, verileri bir dizide saklayabilir ve ardından her veri parçasını döngüde 1'e 1 döndürmeye çalışmak yerine geri döndürebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.