详解Javascript中的Generator生成器
什么是Generator生成器?
生成器是在函数内部运行的一些代码
返回值后,它会自行暂停,并且——
调用程序可以要求取消暂停并返回另一个值
这种“返回”不是传统的从函数 return
。所以它被赋予了一个特殊的名称——yield
。
生成器语法因语言而异。 Javascript 的生成器语法类似于 PHP,但是区别也很大,如果你希望它们的作用相同,那么最终你会感到非常困惑。
在 javascript 中,如果想要使用生成器,则需要:
定义特殊的生成器函数
调用该函数创建一个生成器对象
在循环中使用该生成器对象,或直接调用其
next
方法
我们以下面这个简单的程序做为起点,并执行以下每个步骤:
// File: sample-program.js function *createGenerator() { for(let i=0;i<20;i++) { yield i } } const generator = createGenerator() console.log(generator.next()) console.log(generator.next())
如果运行这段代码,则会得到以下输出:
$ node sample-program.js { value: 0, done: false } { value: 1, done: false }
下面我来解释该程序是如何工作的。
生成器函数
首先,代码中存在生成器函数的定义:
function* createGenerator() { for(let i=0;i<20;i++) { yield i } }
function
后面的 *
告诉 javascript 这是一个生成器函数。以下写法都是生成器函数的有效定义。
function*createGenerator function* createGenerator function *createGenerator
*
并不是函数名的一部分。而是 function*
符号定义了生成器。
调用生成器函数
定义了生成器函数后,我们将其命名为其他名称的函数。
// 注意:当调用时,没有 *。 * 不是函数名称的一部分 // `function *` 是用于定义生成器函数的符号 const generator = createGenerator()
但是要记住:createGenerator
函数没有返回值。这是因为生成器函数没有传统的返回值。相反,当你直接调用生成器函数时,它总是返回实例化的 Generator
对象。
这个生成器对象具有一个 next
方法。调用 next
将在生成器函数内部运行代码。
function* createGenerator() { for(let i=0;i<20;i++) { yield i } }
这很重要,足以再次调用它。直接调用生成器函数不会在生成器函数中运行任何代码。而是创建一个生成器对象。它在生成器对象上调用 next
,从而调用生成器函数中的代码。
首次在生成器对象上调用 next
时,内部代码将会一直运行,直到出现 yield
语句。一旦执行到 yield
,javascript 将会暂停该代码的执行,而 next
将返回(即给你,或yield
)一个对象,该对象包含 yield
行中的值。
当你第二次(或第三次、第四次甚至更多次)再调用 next
时,代码将会取消暂停并继续运行(在上次调用时中断的地方)。变量(例如本例中的 i
)将会保持它的值。当代码到达另一个 yield
语句时,该函数会再次暂停,并返回一个包含 yield 值的对象。
这就是为什么我们要调用两次 next
console.log(generator.next()) console.log(generator.next())
会得到以下输出:
{ value: 0, done: false } { value: 1, done: false }
生成器函数中的代码执行完毕后,将来对 next
的任何调用都会返回一个对象,该对象的值为 undefined 且done
设置为 true
。
{ value: undefined, done: true }
生成器和循环
虽然可以在生成器对象上手动调用 next
,但我们主要是要在循环中使用。看一下这个稍作修改的程序。
// File: sample-program.js @highlightsyntax@jscript function *createGenerator() { for(let i=0;i<5;i++) { yield i } } const generator = createGenerator() for(const value of generator) { console.log(value) }
当在 for...of
循环中使用生成器对象时,每次循环都会在生成器对象上调用 next
,并用产生的值填充变量(上面的 value
)。运行该程序将会输出以下内容:
$ node sample-program.js 0 1 2 3 4
在下一篇文章中,我们将更深入地探讨 for ... of
循环,并探索怎样为 javascript 提供一种内置方法来循环 javascript 中的任何对象
英文原文地址:https://alanstorm.com/javascript-generators/
作者:Alan Storm
译文地址:https://segmentfault.com/a/1190000023924834
更多编程相关知识,请访问:编程入门!!
Atas ialah kandungan terperinci 详解Javascript中的Generator生成器. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Cara menggunakan WebSocket dan JavaScript untuk melaksanakan sistem pengecaman pertuturan dalam talian Pengenalan: Dengan perkembangan teknologi yang berterusan, teknologi pengecaman pertuturan telah menjadi bahagian penting dalam bidang kecerdasan buatan. Sistem pengecaman pertuturan dalam talian berdasarkan WebSocket dan JavaScript mempunyai ciri kependaman rendah, masa nyata dan platform merentas, dan telah menjadi penyelesaian yang digunakan secara meluas. Artikel ini akan memperkenalkan cara menggunakan WebSocket dan JavaScript untuk melaksanakan sistem pengecaman pertuturan dalam talian.

WebSocket dan JavaScript: Teknologi utama untuk merealisasikan sistem pemantauan masa nyata Pengenalan: Dengan perkembangan pesat teknologi Internet, sistem pemantauan masa nyata telah digunakan secara meluas dalam pelbagai bidang. Salah satu teknologi utama untuk mencapai pemantauan masa nyata ialah gabungan WebSocket dan JavaScript. Artikel ini akan memperkenalkan aplikasi WebSocket dan JavaScript dalam sistem pemantauan masa nyata, memberikan contoh kod dan menerangkan prinsip pelaksanaannya secara terperinci. 1. Teknologi WebSocket

Pengenalan kepada cara menggunakan JavaScript dan WebSocket untuk melaksanakan sistem pesanan dalam talian masa nyata: Dengan populariti Internet dan kemajuan teknologi, semakin banyak restoran telah mula menyediakan perkhidmatan pesanan dalam talian. Untuk melaksanakan sistem pesanan dalam talian masa nyata, kami boleh menggunakan teknologi JavaScript dan WebSocket. WebSocket ialah protokol komunikasi dupleks penuh berdasarkan protokol TCP, yang boleh merealisasikan komunikasi dua hala masa nyata antara pelanggan dan pelayan. Dalam sistem pesanan dalam talian masa nyata, apabila pengguna memilih hidangan dan membuat pesanan

Cara menggunakan WebSocket dan JavaScript untuk melaksanakan sistem tempahan dalam talian Dalam era digital hari ini, semakin banyak perniagaan dan perkhidmatan perlu menyediakan fungsi tempahan dalam talian. Adalah penting untuk melaksanakan sistem tempahan dalam talian yang cekap dan masa nyata. Artikel ini akan memperkenalkan cara menggunakan WebSocket dan JavaScript untuk melaksanakan sistem tempahan dalam talian dan memberikan contoh kod khusus. 1. Apakah itu WebSocket? WebSocket ialah kaedah dupleks penuh pada sambungan TCP tunggal.

JavaScript dan WebSocket: Membina sistem ramalan cuaca masa nyata yang cekap Pengenalan: Hari ini, ketepatan ramalan cuaca sangat penting kepada kehidupan harian dan membuat keputusan. Apabila teknologi berkembang, kami boleh menyediakan ramalan cuaca yang lebih tepat dan boleh dipercayai dengan mendapatkan data cuaca dalam masa nyata. Dalam artikel ini, kita akan mempelajari cara menggunakan teknologi JavaScript dan WebSocket untuk membina sistem ramalan cuaca masa nyata yang cekap. Artikel ini akan menunjukkan proses pelaksanaan melalui contoh kod tertentu. Kami

Tutorial JavaScript: Bagaimana untuk mendapatkan kod status HTTP, contoh kod khusus diperlukan: Dalam pembangunan web, interaksi data dengan pelayan sering terlibat. Apabila berkomunikasi dengan pelayan, kami selalunya perlu mendapatkan kod status HTTP yang dikembalikan untuk menentukan sama ada operasi itu berjaya dan melaksanakan pemprosesan yang sepadan berdasarkan kod status yang berbeza. Artikel ini akan mengajar anda cara menggunakan JavaScript untuk mendapatkan kod status HTTP dan menyediakan beberapa contoh kod praktikal. Menggunakan XMLHttpRequest

Penggunaan: Dalam JavaScript, kaedah insertBefore() digunakan untuk memasukkan nod baharu dalam pepohon DOM. Kaedah ini memerlukan dua parameter: nod baharu untuk dimasukkan dan nod rujukan (iaitu nod di mana nod baharu akan dimasukkan).

Jika anda tidak sabar-sabar untuk mencari penjana seni animasi AI percuma teratas, anda boleh menamatkan carian anda. Dunia seni anime telah menawan penonton selama beberapa dekad dengan reka bentuk watak yang unik, warna yang menawan dan plot yang menawan. Walau bagaimanapun, mencipta seni anime memerlukan bakat, kemahiran, dan banyak masa. Walau bagaimanapun, dengan pembangunan kecerdasan buatan (AI) yang berterusan, anda kini boleh meneroka dunia seni animasi tanpa perlu mendalami teknologi yang kompleks dengan bantuan penjana seni animasi AI percuma yang terbaik. Ini akan membuka kemungkinan baharu untuk anda melancarkan kreativiti anda. Apakah penjana seni anime AI? Penjana Seni Animasi AI menggunakan algoritma canggih dan teknik pembelajaran mesin untuk menganalisis pangkalan data karya animasi yang luas. Melalui algoritma ini, sistem mempelajari dan mengenal pasti gaya animasi yang berbeza
