摘要:返回的遍歷器對(duì)象,可以依次遍歷函數(shù)內(nèi)部的每一個(gè)狀態(tài)。方法調(diào)用遍歷器對(duì)象的方法,使得指針移向下一個(gè)狀態(tài)。運(yùn)行結(jié)果就是使用一個(gè)遍歷器,遍歷了多個(gè)函數(shù),有遞歸的效果。
1、Generator簡(jiǎn)介
基本概念
Generator函數(shù)有多種理解角度。從語(yǔ)法上,首先可以把它理解成,Generator函數(shù)是一個(gè)狀態(tài)機(jī),封裝了多個(gè)內(nèi)部狀態(tài)。
執(zhí)行Generator函數(shù)會(huì)返回一個(gè)遍歷器對(duì)象,也就是說(shuō),Generator函數(shù)除了狀態(tài)機(jī),還是一個(gè)遍歷器對(duì)象生成函數(shù)。返回的遍歷器對(duì)象,可以依次遍歷Generator函數(shù)內(nèi)部的每一個(gè)狀態(tài)。
形式上,Generator函數(shù)是一個(gè)普通函數(shù),但是有兩個(gè)特征。一是,function命令與函數(shù)名之間有一個(gè)星號(hào);二是,函數(shù)體內(nèi)部使用yield語(yǔ)句,定義不同的內(nèi)部狀態(tài)(yield語(yǔ)句在英語(yǔ)里的意思就是“產(chǎn)出”)。
"use strict"; function * helloWorldGenerator() { yield "hello"; yield "world"; return "ending"; } let hw = helloWorldGenerator();
上面代碼定義了一個(gè)Generator函數(shù)helloWorldGenerator,它內(nèi)部有兩個(gè)yield語(yǔ)句“hello”和“world”,即該函數(shù)有三個(gè)狀態(tài):hello,world和return語(yǔ)句(結(jié)束執(zhí)行)。
然后,Generator函數(shù)的調(diào)用方法與普通函數(shù)一樣,也是在函數(shù)名后面加上一對(duì)圓括號(hào)。不同的是,調(diào)用Generator函數(shù)后,該函數(shù)并不執(zhí)行,返回的也不是函數(shù)運(yùn)行結(jié)果,而是一個(gè)指向內(nèi)部狀態(tài)的指針對(duì)象,遍歷器對(duì)象(Iterator Object)。
2、next方法調(diào)用遍歷器對(duì)象的next方法,使得指針移向下一個(gè)狀態(tài)。也就是說(shuō),每次調(diào)用next方法,內(nèi)部指針就從函數(shù)頭部或上一次停下來(lái)的地方開始執(zhí)行,直到遇到下一個(gè)yield語(yǔ)句(或return語(yǔ)句)為止。換言之,Generator函數(shù)是分段執(zhí)行的,yield語(yǔ)句是暫停執(zhí)行的標(biāo)記,而next方法可以恢復(fù)執(zhí)行。
hw.next() // { value: "hello", done: false } hw.next() // { value: "world", done: false } hw.next() // { value: "ending", done: true } hw.next() // { value: undefined, done: true }
上面代碼一共調(diào)用了四次next方法。
第一次調(diào)用,Generator函數(shù)開始執(zhí)行,直到遇到第一個(gè)yield語(yǔ)句為止。next方法返回一個(gè)對(duì)象,它的value屬性就是當(dāng)前yield語(yǔ)句的值hello,done屬性的值false,表示遍歷還沒(méi)有結(jié)束。
第二次調(diào)用,Generator函數(shù)從上次yield語(yǔ)句停下的地方,一直執(zhí)行到下一個(gè)yield語(yǔ)句。next方法返回的對(duì)象的value屬性就是當(dāng)前yield語(yǔ)句的值world,done屬性的值false,表示遍歷還沒(méi)有結(jié)束。
第三次調(diào)用,Generator函數(shù)從上次yield語(yǔ)句停下的地方,一直執(zhí)行到return語(yǔ)句(如果沒(méi)有return語(yǔ)句,就執(zhí)行到函數(shù)結(jié)束)。next方法返回的對(duì)象的value屬性,就是緊跟在return語(yǔ)句后面的表達(dá)式的值(如果沒(méi)有return語(yǔ)句,則value屬性的值為undefined),done屬性的值true,表示遍歷已經(jīng)結(jié)束。
第四次調(diào)用,此時(shí)Generator函數(shù)已經(jīng)運(yùn)行完畢,next方法返回對(duì)象的value屬性為undefined,done屬性為true。以后再調(diào)用next方法,返回的都是這個(gè)值。
總結(jié)一下,調(diào)用Generator函數(shù),返回一個(gè)遍歷器對(duì)象,代表Generator函數(shù)的內(nèi)部指針。以后,每次調(diào)用遍歷器對(duì)象的next方法,就會(huì)返回一個(gè)有著value和done兩個(gè)屬性的對(duì)象。value屬性表示當(dāng)前的內(nèi)部狀態(tài)的值,是yield語(yǔ)句后面那個(gè)表達(dá)式的值;done屬性是一個(gè)布爾值,表示是否遍歷結(jié)束。
3、yield*語(yǔ)句用來(lái)在一個(gè)Generator函數(shù)里面執(zhí)行另一個(gè)Generator函數(shù),我們需要用yield*語(yǔ)句。
如果yield命令后面跟的是一個(gè)遍歷器對(duì)象,需要在yield命令后面加上星號(hào),表明它返回的是一個(gè)遍歷器對(duì)象。這被稱為yield*語(yǔ)句。
"use strict"; function *anotherGenerator(i) { yield i + 1; yield i + 2; yield i + 3; } function *generator(i) { yield i; yield *anotherGenerator(i); yield i + 10; } let gen = generator(10); console.log(gen.next().value);//10 console.log(gen.next().value);//11 console.log(gen.next().value);//12 console.log(gen.next().value);//13 console.log(gen.next().value);//20 console.log(gen.next().value);//undefined
運(yùn)行結(jié)果就是使用一個(gè)遍歷器,遍歷了多個(gè)Generator函數(shù),有遞歸的效果。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/83639.html
摘要:迭代器和生成器將迭代的概念直接帶入核心語(yǔ)言,并提供一種機(jī)制來(lái)自定義循環(huán)的行為。本文主要會(huì)介紹中新增的迭代器和生成器。屬性本身是函數(shù),是當(dāng)前數(shù)據(jù)結(jié)構(gòu)默認(rèn)的迭代器生成函數(shù)。 本文是 重溫基礎(chǔ) 系列文章的第十三篇。今日感受:每次自我年終總結(jié),都會(huì)有各種情緒和收獲。 系列目錄: 【復(fù)習(xí)資料】ES6/ES7/ES8/ES9資料整理(個(gè)人整理) 【重溫基礎(chǔ)】1.語(yǔ)法和數(shù)據(jù)類型 【重溫基礎(chǔ)】2.流...
摘要:下面我以主題舉例,覆蓋默認(rèn)主題。其他元素使用相同的方法都可以修改。像這種超鏈接跳轉(zhuǎn)的修改,在文件中找到直接把屬性的值改變即可。 準(zhǔn)備:搭建環(huán)境 大致分為以下兩步: 安裝Node.js 安裝git 配置Node.js環(huán)境 下載Node.js安裝 Windows Installer 32-bithttps://nodejs.org/dist/v4.2.3/node-v4.2.3-x...
摘要:下面我以主題舉例,覆蓋默認(rèn)主題。其他元素使用相同的方法都可以修改。像這種超鏈接跳轉(zhuǎn)的修改,在文件中找到直接把屬性的值改變即可。 準(zhǔn)備:搭建環(huán)境 大致分為以下兩步: 安裝Node.js 安裝git 配置Node.js環(huán)境 下載Node.js安裝 Windows Installer 32-bithttps://nodejs.org/dist/v4.2.3/node-v4.2.3-x...
摘要:對(duì)已經(jīng)躍躍欲試很久,恰遇最近正式發(fā)布,今天嘗試著倒騰一番。所以自己對(duì)的學(xué)習(xí)算是從開始,由于文檔資源還不完全,準(zhǔn)備踩著前輩們的肩膀,慢慢入坑。常識(shí)入門級(jí)程序與大部分程序員同胞一樣樣的習(xí)慣,寫一發(fā)慰藉自己孤寂的心靈。 對(duì)koa已經(jīng)躍躍欲試很久,恰遇koa2最近正式發(fā)布,今天嘗試著倒騰一番。所以自己對(duì)koa的學(xué)習(xí)算是從2.x開始,由于文檔資源還不完全,準(zhǔn)備踩著前輩們的肩膀,慢慢入坑。 環(huán)境的...
摘要:規(guī)則簡(jiǎn)介花了一天整理的,可能部分翻譯的有錯(cuò)誤,后面會(huì)再校對(duì)一次規(guī)則說(shuō)明默認(rèn)情況下不會(huì)啟用任何規(guī)則。 eslint V4.1.1 規(guī)則簡(jiǎn)介 花了一天整理的,可能部分翻譯的有錯(cuò)誤,后面會(huì)再校對(duì)一次 規(guī)則說(shuō)明:默認(rèn)情況下不會(huì)啟用任何規(guī)則。配置文件中的extends:eslint:recommended屬性可以啟用一些默認(rèn)的驗(yàn)證規(guī)則,默認(rèn)的規(guī)則在下表會(huì)用R表示出來(lái) 使用--fix命令可以自動(dòng)修...
閱讀 4392·2021-11-24 10:24
閱讀 1419·2021-11-22 15:22
閱讀 2048·2021-11-17 09:33
閱讀 2457·2021-09-22 15:29
閱讀 526·2019-08-30 15:55
閱讀 1666·2019-08-29 18:42
閱讀 2743·2019-08-29 12:55
閱讀 1784·2019-08-26 13:55