成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Node v4 - Generator函數(shù)

cnTomato / 735人閱讀

摘要:返回的遍歷器對(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):helloworldreturn語(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ǔ)句的值worlddone屬性的值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屬性為undefineddone屬性為true。以后再調(diào)用next方法,返回的都是這個(gè)值。

總結(jié)一下,調(diào)用Generator函數(shù),返回一個(gè)遍歷器對(duì)象,代表Generator函數(shù)的內(nèi)部指針。以后,每次調(diào)用遍歷器對(duì)象的next方法,就會(huì)返回一個(gè)有著valuedone兩個(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

相關(guān)文章

  • 【重溫基礎(chǔ)】13.迭代器和生成器

    摘要:迭代器和生成器將迭代的概念直接帶入核心語(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.流...

    ymyang 評(píng)論0 收藏0
  • 【HEXO】從零搭建HEXO博客 修改默認(rèn)主題/參數(shù)/favicon 替換個(gè)人主頁(yè)

    摘要:下面我以主題舉例,覆蓋默認(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...

    My_Oh_My 評(píng)論0 收藏0
  • 【HEXO】從零搭建HEXO博客 修改默認(rèn)主題/參數(shù)/favicon 替換個(gè)人主頁(yè)

    摘要:下面我以主題舉例,覆蓋默認(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...

    Near_Li 評(píng)論0 收藏0
  • 開始學(xué)習(xí)koa

    摘要:對(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)境的...

    KunMinX 評(píng)論0 收藏0
  • eslint V4.1.1 規(guī)則簡(jiǎ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)修...

    tuomao 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<