Apakah return menghentikan satu loop?

157

Misalkan saya memiliki loop seperti ini:

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

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

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

Pertanyaan cepat: apakah returnmenghentikan eksekusi loop itu sendiri?

perancis
sumber

Jawaban:

206

Ya, returnhentikan eksekusi dan keluar dari fungsi. returnselalu ** segera keluar dari fungsinya, tanpa eksekusi lebih lanjut jika berada di dalam for loop.

Mudah diverifikasi untuk diri sendiri:

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

alert(returnMe());
// 1

** Catatan: Lihat jawaban lain ini tentang kasus khusus try/catch/finally dan jawaban ini tentang bagaimana forEach loop memiliki ruang lingkup fungsi sendiri tidak akan keluar dari fungsi yang berisi.

Michael Berkowski
sumber
25
> return selalu keluar dari fungsinya dengan segera, tanpa eksekusi lebih lanjut jika itu ada di dalam sebuah loop ... kecuali itu adalah forEach loop
oo
9
@oo Agak benar. returnmasih kembali dari iterasi fungsi callback saat ini, dalam cakupannya sendiri, tetapi tidak diharapkan untuk keluar dari seluruh metode pemanggilan forEach(). Jadi itu tidak kembali dari loop itu sendiri , tetapi kembali dari callback loop dijalankan. Dalam contoh kode dari pertanyaan yang ditautkan, output 1,2,4,5dilewati 3karena pengembalian.
Michael Berkowski
Mungkin benang merahnya adalah yang returnakan selalu kembali dari thiskonteks saat ini .
oo
Alternatif untuk menggunakan forEach () atau untuk () pada array untuk "berpotensi" terminasi loop awal menggunakan some ().
AnBisw
1
Aku tahu ini adalah sepele bagi sebagian orang, tapi ini begitu baik tahu karena Anda tidak lagi harus breakdan kemudian return.
NoName
60

Dalam kebanyakan kasus (termasuk yang ini), returnakan segera keluar. Namun, jika pengembalian berada di tryblok dengan blok yang menyertainya finally, finallyselalu dijalankan dan dapat "menimpa" returndi 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
sumber
8

The returnpernyataan berhenti loop hanya jika itu dalam fungsi. Jika tidak, Anda akan mendapatkan kesalahan ini:

Uncaught SyntaxError: Illegal return statement(…)
Damjan Pavlica
sumber
6

Kode ini akan keluar dari loop setelah iterasi pertama dalam satu for ofloop:

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

kode di bawah ini akan melompat pada kondisi dan melanjutkan for ofloop:

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
sumber
Terima kasih, ini banyak membantu saya, saya menggunakan simpul dan kembaliannya melanggar untuk saya, untuk masing-masing dan untuk ... dari, terus berfungsi seperti yang saya harapkan
veroneseComS
5

Ya, begitu return pernyataan dieksekusi, seluruh fungsi keluar pada saat itu juga.

Bayangkan saja apa yang akan terjadi jika tidak dan terus berulang, dan menjalankan returnpernyataan itu setiap kali? Itu akan membatalkan arti mengembalikan nilai ketika Anda memikirkannya.

Keldon Alleyne
sumber
1

Jawabannya adalah ya, jika Anda menulis kembali pernyataan kontrol segera kembali ke metode pemanggil. Dengan pengecualian pada akhirnya blok, yang dieksekusi setelah pernyataan kembali.

dan akhirnya juga dapat mengganti nilai yang telah Anda kembalikan, jika Anda kembali ke dalam akhirnya blok. LINK: Coba-tangkap-akhirnya-kembali klarifikasi

Pengembalian definisi Pernyataan sesuai:

Java Docs:

pernyataan kembali dapat digunakan untuk keluar dari blok aliran kontrol dan keluar dari metode

Dokumentasi MSDN:

Pernyataan pengembalian mengakhiri eksekusi fungsi dan mengembalikan kontrol ke fungsi panggilan. Eksekusi dilanjutkan dalam fungsi panggilan pada titik segera setelah panggilan.

Wikipedia:

Pernyataan pengembalian menyebabkan eksekusi meninggalkan subrutin saat ini dan melanjutkan pada titik dalam kode segera setelah tempat subrutin dipanggil, dikenal sebagai alamat pengirim. Alamat kembali disimpan, biasanya di tumpukan panggilan proses, sebagai bagian dari operasi membuat panggilan subrutin. Pernyataan pengembalian dalam banyak bahasa memungkinkan fungsi menentukan nilai kembali yang akan dikembalikan ke kode yang disebut fungsi.

pengguna1179299
sumber
Anda perlu menautkan sumber yang Anda gunakan dengan benar, dan secara ideal memformat tanda kutip juga.
Nathan Tuggy
apakah itu terlihat baik sekarang?
user1179299
Saya menghargai perbaikan tata bahasa, tetapi masih belum ada tautan, dan Anda masih belum menggunakan pemformatan blokquote.
Nathan Tuggy
0

"return" tidak keluar dari fungsi tetapi jika Anda ingin mengembalikan sejumlah besar data, Anda dapat menyimpannya dalam sebuah array dan kemudian mengembalikannya daripada mencoba mengembalikan setiap bagian data 1 per 1 dalam loop.

Brendon McBain
sumber