成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Javascript中Generator生成器有什么用-創(chuàng)新互聯(lián)

小編給大家分享一下Javascript中Generator生成器有什么用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

公司主營(yíng)業(yè)務(wù):做網(wǎng)站、網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶(hù)真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶(hù)帶來(lái)驚喜。創(chuàng)新互聯(lián)推出本溪免費(fèi)做網(wǎng)站回饋大家。

什么是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ù)

首先,代碼中存在生成器函數(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)定義了生成器。

調(diào)用生成器函數(shù)

定義了生成器函數(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ì)象的值為undefineddone 設(shè)置為true。

{ value: undefined, done: true }

生成器和循環(huán)

雖然可以在生成器對(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)

成都網(wǎng)頁(yè)設(shè)計(jì)公司
英山县| 许昌市| 合水县| 加查县| 萍乡市| 吉林市| 辽宁省| 澄迈县| 新兴县| 阿合奇县| 禹州市| 宁津县| 新津县| 望城县| 桓台县| 寿光市| 翁牛特旗| 绥芬河市| 秀山| 榆林市| 临湘市| 晋中市| 淳化县| 嘉定区| 云南省| 乌兰察布市| 历史| 遂昌县| 花垣县| 楚雄市| 伊金霍洛旗| 九龙城区| 盱眙县| 天长市| 盘锦市| 万州区| 宣威市| 凤翔县| 衡阳县| 贵溪市| 霸州市|