Ini adalah fungsi Generator .
Generator adalah fungsi yang dapat keluar dan kemudian dimasukkan kembali. Konteks mereka (binding variabel) akan disimpan di seluruh pintu masuk.
Memanggil fungsi generator tidak menjalankan tubuhnya dengan segera; objek iterator untuk fungsi dikembalikan sebagai gantinya. Ketika metode iterator next()
dipanggil, fungsi fungsi generator dijalankan sampai yield
ekspresi pertama , yang menentukan nilai yang akan dikembalikan dari iterator atau, dengan yield*
, mendelegasikan ke fungsi generator lain.
Catatan sejarah:
Ini sintaks yang diusulkan untuk EcmaScript.next
.
Dave Herman dari Mozilla memberi ceramah tentang EcmaScript.next . Pada 30:15 ia berbicara tentang generator.
Sebelumnya, dia menjelaskan bagaimana Mozilla secara eksperimental menerapkan perubahan bahasa yang diusulkan untuk membantu mengarahkan komite. Dave bekerja sama dengan Brendan Eich, CTO Mozilla (saya pikir), dan perancang JavaScript asli.
Anda dapat menemukan lebih detail tentang wiki kelompok kerja EcmaScript: http://wiki.ecmascript.org/doku.php?id=harmony:generators
Kelompok kerja (TC-39) memiliki persetujuan umum bahwa EcmaScript.next harus memiliki semacam proposal generator iterator, tetapi ini belum final.
Anda tidak boleh mengandalkan ini muncul tanpa perubahan dalam versi bahasa berikutnya, dan bahkan jika itu tidak berubah, itu mungkin tidak akan muncul secara luas di browser lain untuk sementara waktu.
Gambaran
Coroutine kelas satu, direpresentasikan sebagai objek yang mengenkapsulasi konteks eksekusi yang ditangguhkan (yaitu, aktivasi fungsi). Seni sebelumnya: Python, Ikon, Lua, Skema, Smalltalk.
Contohnya
Urutan "tak terbatas" dari angka-angka Fibonacci (meskipun perilaku sekitar 2 53 ):
function* fibonacci() {
let [prev, curr] = [0, 1];
for (;;) {
[prev, curr] = [curr, prev + curr];
yield curr;
}
}
Generator dapat diulang dalam loop:
for (n of fibonacci()) {
// truncate the sequence at 1000
if (n > 1000)
break;
print(n);
}
Generator adalah iterator:
let seq = fibonacci();
print(seq.next()); // 1
print(seq.next()); // 2
print(seq.next()); // 3
print(seq.next()); // 5
print(seq.next()); // 8
function*
sintaks didukung di Firefox sejak v26: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… *. Versi yang lebih lama menggunakan sintaks yang berbeda.