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