Seperti yang kita sedia maklum, JavaScript ialah bahasa pengaturcaraan yang ringan, dan penjana telah diperkenalkan dalam ECMAScript 2015. Penjana ialah proses yang mempunyai banyak nilai keluaran dan boleh dihentikan dan dimulakan. Dalam JavaScript, penjana terdiri daripada fungsi penjana yang menghasilkan objek penjana yang boleh diubah.
Dalam artikel ini, kami akan membincangkan penjana dalam JavaScript dan pelbagai jenis penjana dalam JavaScript secara terperinci dengan sintaks dan contoh.
Fungsi generator adalah sama seperti fungsi biasa, tetapi dengan satu perbezaan, fungsi generator boleh disambung semula dan dijeda. Secara umumnya, dalam JavaScript, fungsi tidak berhenti sebaik sahaja ia dipanggil. Biasanya, konsep penjana muncul dalam pengaturcaraan tak segerak.
Sekarang kita akan membincangkan sintaks fungsi penjana dalam JavaScript dan membandingkannya dengan fungsi biasa.
Sintaksfungsi * digunakan untuk membina fungsi penjana dan kata kunci hasil digunakan untuk menjedanya.
function * genFunc() { yield 'Hello'; yield 'World'; } const g = genFunc(); // g is a generator g.next(); // { value: 'Hello', done: false } g.next(); // { value: 'World', done: false } g.next(); // { value: undefined, done: true } …
Apabila fungsi penjana dipanggil buat kali pertama, tiada kodnya dijalankan, tetapi objek penjana dikembalikan. Nilai digunakan dengan memanggil kaedah next() penjana, yang menjalankan kod sehingga ia menemui kata kunci hasil, di mana ia berhenti seketika dan menunggu sehingga next() dipanggil semula.
Dalam kod di atas, selepas penyataan terakhir kami, panggilan berturut-turut ke g.next() hanya akan menghasilkan objek pulangan yang sama: {value: undefined, did: true}, kerana kami berada dalam 'dunia' kod kami ' Tiada apa-apa ditakrifkan selepas itu. fungsi genFunc().
Kata kuncihasil menjeda pelaksanaan fungsi penjana dan memberikan nilai ungkapan yang mengikutinya kepada pemanggil penjana. Ia adalah setanding dengan versi berasaskan penjana kata kunci pulangan. Hanya boleh dipanggil terus daripada fungsi penjana yang mengandungi hasil.
function regFunc() { console.log("Hello World"); } // Hello World
Dalam fungsi biasa kami tidak menggunakan fungsi "*" dan seperti yang anda lihat dalam contoh di atas ia juga tidak menggunakan fungsi hasil. Seperti yang kita bincangkan di atas, perbezaan utama antara fungsi biasa dan fungsi penjana ialah fungsi penjana boleh dihentikan dan dijeda. Jadi daripada contoh di atas, anda dapat melihat bahawa kami tidak memilih untuk menghentikannya, tetapi terus mencetak keseluruhan kenyataan, iaitu "Hello world".
Seperti yang telah kita fahami asas fungsi penjana, kini mari kita beralih kepada jenis fungsi penjana yang berbeza -
Dalam penjana biasa, penjana bertindak sebagai lelaran, menjana nilai seterusnya selepas setiap panggilan kaedah seterusnya() dilaksanakan untuk menjana fungsi. Mari kita lihat contoh di mana kita akan menjana nombor satu demi satu sehingga akhir senarai.
function* generator_function(){ for(var cur = 0 ; cur<7; cur++){ yield cur; } } var object_generator = generator_function(); console.log(object_generator.next().value); console.log(object_generator.next().value); console.log(object_generator.next().value); console.log(object_generator.next().value); console.log(object_generator.next().value); console.log(object_generator.next().value); console.log(object_generator.next().value);
Dalam kod di atas, kami telah mencipta fungsi generik biasa yang mengandungi kata kunci hasil dan memanggilnya beberapa kali menggunakan fungsi next().
Penjana dengan parameter sedikit berbeza daripada penjana biasa, kali ini kita perlu lulus parameter menggunakan fungsi next() untuk menghantarnya ke fungsi penjana. Selain itu, setiap kali kami melepasi parameter, ia akan disimpan selepas kata kunci hasil dan bukan sebelum ini, kami akan memahami konsep ini dalam contoh seterusnya -
function* generator_function(){ console.log("start of the function") temp = yield; console.log("This is the first value passed: " + temp) temp = yield; console.log("This is the second value passed: " + temp) } var object_generator = generator_function(); object_generator.next("This is not the first "); object_generator.next("this is first"); object_generator.next("this is second"); object_generator.next();
Dalam kod di atas, kami mentakrifkan fungsi penjana dan kali ini kami menyerahkan parameter kepadanya. Apabila kita memanggil objek untuk kali pertama, parameter yang diberikan tidak dicetak kerana ini dihantar sebelum kata kunci "hasil" dan kemudian selepas nilai yang dihantar disimpan dalam pembolehubah dan dicetak, nilai dicetak kali kedua Selepas itu, tiada apa yang berlaku kerana tiada keluaran pada masa ini.
Penjana boleh digunakan sebagai objek dan apabila kita memanggilnya, ia hanya mengembalikan nilai yang diberikan kepadanya dan boleh dicetak. Untuk memahami konsep ini, mari kita lihat contoh.
function* generator_function(){ yield "First value" yield "Second value" yield "Third value" } var object_generator = generator_function(); console.log(object_generator.next().value); console.log(object_generator.next().value); console.log(object_generator.next().value);
Dalam kod di atas, pertama, kami mentakrifkan tiga ungkapan hasil, dan terdapat rentetan selepasnya Apabila kami memanggil penjana, rentetan selepasnya akan dikembalikan.
Terdapat juga jenis generator lain, seperti jenis pulangan, beberapa generator mengandungi generator lain di dalam, dll.
Dalam artikel itu, kami mengetahui bahawa fungsi penjana adalah sama dengan fungsi biasa, tetapi dengan satu perbezaan, fungsi penjana boleh disambung semula dan dijeda. Secara umumnya, dalam JavaScript, fungsi tidak berhenti sebaik sahaja ia dipanggil. Biasanya, konsep penjana muncul dalam pengaturcaraan tak segerak. Terdapat banyak jenis penjana, seperti penjana biasa dengan objek seperti parameter dan sifat, penjana yang mengandungi penjana lain, dll.
Atas ialah kandungan terperinci Terangkan pelbagai jenis penjana dalam JavaScript. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!