一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務(wù)器之家 - 編程語言 - JavaScript - js教程 - Javascript生成器(Generator)的介紹與使用

Javascript生成器(Generator)的介紹與使用

2022-01-12 16:51瘋狂的技術(shù)宅 js教程

這篇文章主要給大家介紹了關(guān)于Javascript生成器(Generator)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

什么是生成器?

生成器是在函數(shù)內(nèi)部運(yùn)行的一些代碼

  • 返回值后,它會(huì)自行暫停,并且——
  • 調(diào)用程序可以要求取消暫停并返回另一個(gè)值

這種“返回”不是傳統(tǒng)的從函數(shù) return。所以它被賦予了一個(gè)特殊的名稱——yield。

生成器語法因語言而異。Javascript 的生成器語法類似于 PHP,但是區(qū)別也很大,如果你希望它們的作用相同,那么最終你會(huì)感到非常困惑。

在 javascript 中,如果想要使用生成器,則需要:

  • 定義特殊的生成器函數(shù)
  • 調(diào)用該函數(shù)創(chuàng)建一個(gè)生成器對象
  • 在循環(huán)中使用該生成器對象,或直接調(diào)用其 next 方法

我們以下面這個(gè)簡單的程序做為起點(diǎn),并執(zhí)行以下每個(gè)步驟:

?
1
2
3
4
5
6
7
8
9
10
11
// 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 }

下面我來解釋該程序是如何工作的。

生成器函數(shù)

首先,代碼中存在生成器函數(shù)的定義:

?
1
2
3
4
5
function* createGenerator() {
 for(let i=0;i<20;i++) {
 yield i
 }
}

function 后面的 * 告訴 javascript 這是一個(gè)生成器函數(shù)。以下寫法都是生成器函數(shù)的有效定義。

?
1
2
3
function*createGenerator
function* createGenerator
function *createGenerator

*  并不是函數(shù)名的一部分。而是 function* 符號(hào)定義了生成器。

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

定義了生成器函數(shù)后,我們將其命名為其他名稱的函數(shù)。

?
1
2
3
// 注意:當(dāng)調(diào)用時(shí),沒有 *。 * 不是函數(shù)名稱的一部分
// `function *` 是用于定義生成器函數(shù)的符號(hào)
const generator = createGenerator()

但是要記住:createGenerator 函數(shù)沒有返回值。這是因?yàn)樯善骱瘮?shù)沒有傳統(tǒng)的返回值。相反,當(dāng)你直接調(diào)用生成器函數(shù)時(shí),它總是返回實(shí)例化的 Generator 對象。

這個(gè)生成器對象具有一個(gè) next 方法。調(diào)用 next 將在生成器函數(shù)內(nèi)部運(yùn)行代碼。

?
1
2
3
4
5
function* createGenerator() {
 for(let i=0;i<20;i++) {
  yield i
 }
}

這很重要,足以再次調(diào)用它。直接調(diào)用生成器函數(shù)不會(huì)在生成器函數(shù)中運(yùn)行任何代碼。而是創(chuàng)建一個(gè)生成器對象。它在生成器對象上調(diào)用 next,從而調(diào)用生成器函數(shù)中的代碼。

首次在生成器對象上調(diào)用 next 時(shí),內(nèi)部代碼將會(huì)一直運(yùn)行,直到出現(xiàn) yield 語句。一旦執(zhí)行到 yield,javascript 將會(huì)暫停該代碼的執(zhí)行,而 next 將返回(即給你,或yield)一個(gè)對象,該對象包含 yield 行中的值。

當(dāng)你第二次(或第三次、第四次甚至更多次)再調(diào)用 next 時(shí),代碼將會(huì)取消暫停并繼續(xù)運(yùn)行(在上次調(diào)用時(shí)中斷的地方)。變量(例如本例中的 i )將會(huì)保持它的值。當(dāng)代碼到達(dá)另一個(gè) yield 語句時(shí),該函數(shù)會(huì)再次暫停,并返回一個(gè)包含 yield 值的對象。

這就是為什么我們要調(diào)用兩次  next

?
1
2
console.log(generator.next())
console.log(generator.next())

會(huì)得到以下輸出:

{ value: 0, done: false }
{ value: 1, done: false }

生成器函數(shù)中的代碼執(zhí)行完畢后,將來對 next 的任何調(diào)用都會(huì)返回一個(gè)對象,該對象的值為 undefined 且done 設(shè)置為 true。

?
1
{ value: undefined, done: true }

生成器和循環(huán)

雖然可以在生成器對象上手動(dòng)調(diào)用 next,但我們主要是要在循環(huán)中使用。看一下這個(gè)稍作修改的程序。

?
1
2
3
4
5
6
7
8
9
10
11
12
// 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)中使用生成器對象時(shí),每次循環(huán)都會(huì)在生成器對象上調(diào)用 next,并用產(chǎn)生的值填充變量(上面的 value)。運(yùn)行該程序?qū)?huì)輸出以下內(nèi)容:

$ node sample-program.js
0
1
2
3
4

在下一篇文章中,我們將更深入地探討 for ... of 循環(huán),并探索怎樣為 javascript 提供一種內(nèi)置方法來循環(huán) javascript 中的任何對象。

總結(jié)

到此這篇關(guān)于Javascript生成器(Generator)的文章就介紹到這了,更多相關(guān)Javascript生成器(Generator)內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://mp.weixin.qq.com/s/BU3-GQ09gSxnVB6s4hGJXw

延伸 · 閱讀

精彩推薦
  • js教程JS addEventListener()和attachEvent()方法實(shí)現(xiàn)注冊事件

    JS addEventListener()和attachEvent()方法實(shí)現(xiàn)注冊事件

    這篇文章主要介紹了JS addEventListener()和attachEvent()方法實(shí)現(xiàn)注冊事件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,...

    C語言中文網(wǎng)9582021-12-30
  • js教程JavaScript實(shí)現(xiàn)通訊錄功能

    JavaScript實(shí)現(xiàn)通訊錄功能

    這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)通訊錄功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下...

    書寫夢想的鉛筆頭5722021-12-20
  • js教程基于JavaScript實(shí)現(xiàn)簡單掃雷游戲

    基于JavaScript實(shí)現(xiàn)簡單掃雷游戲

    這篇文章主要介紹了基于JavaScript實(shí)現(xiàn)簡單掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下...

    北冰洋_WH4342021-12-23
  • js教程js簡單粗暴的發(fā)布訂閱示例代碼

    js簡單粗暴的發(fā)布訂閱示例代碼

    這篇文章主要給大家介紹了js簡單粗暴的發(fā)布訂閱的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要...

    威威威威vvvv6342022-01-06
  • js教程原生js實(shí)現(xiàn)自定義難度的掃雷游戲

    原生js實(shí)現(xiàn)自定義難度的掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了原生js實(shí)現(xiàn)自定義難度的掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下...

    清歡灬6462022-01-06
  • js教程原生js實(shí)現(xiàn)自定義滾動(dòng)條

    原生js實(shí)現(xiàn)自定義滾動(dòng)條

    這篇文章主要為大家詳細(xì)介紹了原生js實(shí)現(xiàn)自定義滾動(dòng)條,可點(diǎn)擊、拖動(dòng)到達(dá),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可...

    Xaivor4072022-01-05
  • js教程Bootstrap FileInput實(shí)現(xiàn)圖片上傳功能

    Bootstrap FileInput實(shí)現(xiàn)圖片上傳功能

    這篇文章主要為大家詳細(xì)介紹了Bootstrap FileInput實(shí)現(xiàn)圖片上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下...

    RNG-航仔8032022-01-10
  • js教程js制作提示框插件

    js制作提示框插件

    這篇文章主要介紹了js制作提示框插件的方法,幫助大家更好的理解和使用js,感興趣的朋友可以了解下...

    lanshanxiao10172021-12-18
主站蜘蛛池模板: 我要看免费毛片 | 91免费播放人人爽人人快乐 | 亚欧洲乱码专区视频 | 91系列在线观看免费 | 国产精品手机视频一区二区 | 五月天黄网 | 国产一级毛片外aaaa | 美女扒开腿让男人桶爽免费gif | 西西人体大胆77777视频 | 91东航翘臀女神在线播放 | 国内会所按摩推拿国产 | 我年轻漂亮的继坶2中字在线播放 | eeuss免费快捷 | 国产精品最新资源网 | 日本视频高清免费观看xxx | 韩国三级在线观看 完整版 韩国三级视频网站 | beeg最新| 黑帮少爷爱上我第8集最新 荷兰精品女人性hd 和日本免费不卡在线v | 欧美日韩在线一区二区三区 | 国产欧美精品一区二区三区 | 国产伦精一区二区三区视频 | 美女扒开两腿露出尿口的视频 | 亚洲国产天堂综合一区 | www.com日本| 学校捏奶揉下面污文h | 高h文恩好大好爽 | 日韩欧美天堂 | 国产精品久久久久无毒 | h玉足嫩脚嗯啊白丝 | 国产成人精视频在线观看免费 | 男人香蕉好大好爽视频 | bbwfreehd女厕所ved | 人人干国产| 久久这里只有精品视频e | 俺去俺也在线www色官网 | a一级一级 | 精品一区二区三区免费站 | 欧美人在线一区二区三区 | 免费导航 | 亚洲天堂日韩在线 | 国产区久久 |