小編給大家分享一下Javascript中Generator生成器有什么用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
生成器是在函數(shù)內(nèi)部運(yùn)行的一些代碼
返回值后,它會(huì)自行暫停,并且——
調(diào)用程序可以要求取消暫停并返回另一個(gè)值
這種“返回”不是傳統(tǒng)的從函數(shù)return
。所以它被賦予了一個(gè)特殊的名稱(chēng)——yield
。
生成器語(yǔ)法因語(yǔ)言而異。 Javascript 的生成器語(yǔ)法類(lèi)似于 PHP,但是區(qū)別也很大,如果你希望它們的作用相同,那么最終你會(huì)感到非常困惑。
在 javascript 中,如果想要使用生成器,則需要:
定義特殊的生成器函數(shù)
調(diào)用該函數(shù)創(chuàng)建一個(gè)生成器對(duì)象
在循環(huán)中使用該生成器對(duì)象,或直接調(diào)用其next
方法
我們以下面這個(gè)簡(jiǎn)單的程序做為起點(diǎn),并執(zhí)行以下每個(gè)步驟:
// 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())
如果運(yùn)行這段代碼,則會(huì)得到以下輸出:
$ node sample-program.js { value: 0, done: false } { value: 1, done: false }
下面我來(lái)解釋該程序是如何工作的。
首先,代碼中存在生成器函數(shù)的定義:
function* createGenerator() { for(let i=0;i<20;i++) { yield i } }
function
后面的*
告訴 javascript 這是一個(gè)生成器函數(shù)。以下寫(xiě)法都是生成器函數(shù)的有效定義。
function*createGenerator function* createGenerator function *createGenerator
*
并不是函數(shù)名的一部分。而是function*
符號(hào)定義了生成器。
定義了生成器函數(shù)后,我們將其命名為其他名稱(chēng)的函數(shù)。
// 注意:當(dāng)調(diào)用時(shí),沒(méi)有 *。 * 不是函數(shù)名稱(chēng)的一部分 // `function *` 是用于定義生成器函數(shù)的符號(hào) const generator = createGenerator()
但是要記住:createGenerator
函數(shù)沒(méi)有返回值。這是因?yàn)樯善骱瘮?shù)沒(méi)有傳統(tǒng)的返回值。相反,當(dāng)你直接調(diào)用生成器函數(shù)時(shí),它總是返回實(shí)例化的Generator
對(duì)象。
這個(gè)生成器對(duì)象具有一個(gè)next
方法。調(diào)用next
將在生成器函數(shù)內(nèi)部運(yùn)行代碼。
function* createGenerator() { for(let i=0;i<20;i++) { yield i } }
這很重要,足以再次調(diào)用它。直接調(diào)用生成器函數(shù)不會(huì)在生成器函數(shù)中運(yùn)行任何代碼。而是創(chuàng)建一個(gè)生成器對(duì)象。它在生成器對(duì)象上調(diào)用next
,從而調(diào)用生成器函數(shù)中的代碼。
首次在生成器對(duì)象上調(diào)用next
時(shí),內(nèi)部代碼將會(huì)一直運(yùn)行,直到出現(xiàn)yield
語(yǔ)句。一旦執(zhí)行到yield
,javascript 將會(huì)暫停該代碼的執(zhí)行,而next
將返回(即給你,或yield
)一個(gè)對(duì)象,該對(duì)象包含yield
行中的值。
當(dāng)你第二次(或第三次、第四次甚至更多次)再調(diào)用next
時(shí),代碼將會(huì)取消暫停并繼續(xù)運(yùn)行(在上次調(diào)用時(shí)中斷的地方)。變量(例如本例中的i
)將會(huì)保持它的值。當(dāng)代碼到達(dá)另一個(gè)yield
語(yǔ)句時(shí),該函數(shù)會(huì)再次暫停,并返回一個(gè)包含 yield 值的對(duì)象。
這就是為什么我們要調(diào)用兩次 next
console.log(generator.next()) console.log(generator.next())
會(huì)得到以下輸出:
{ value: 0, done: false } { value: 1, done: false }
生成器函數(shù)中的代碼執(zhí)行完畢后,將來(lái)對(duì)next
的任何調(diào)用都會(huì)返回一個(gè)對(duì)象,該對(duì)象的值為undefined 且done
設(shè)置為true
。
{ value: undefined, done: true }
雖然可以在生成器對(duì)象上手動(dòng)調(diào)用next
,但我們主要是要在循環(huán)中使用。看一下這個(gè)稍作修改的程序。
// 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) }
當(dāng)在for...of
循環(huán)中使用生成器對(duì)象時(shí),每次循環(huán)都會(huì)在生成器對(duì)象上調(diào)用next
,并用產(chǎn)生的值填充變量(上面的value
)。運(yùn)行該程序?qū)?huì)輸出以下內(nèi)容:
$ node sample-program.js 0 1 2 3 4
以上是“Javascript中Generator生成器有什么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
分享標(biāo)題:Javascript中Generator生成器有什么用-創(chuàng)新互聯(lián)
網(wǎng)址分享:http://jinyejixie.com/article20/diggco.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、響應(yīng)式網(wǎng)站、小程序開(kāi)發(fā)、網(wǎng)站收錄、網(wǎng)站營(yíng)銷(xiāo)、ChatGPT
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容