国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Node v4 - Generator函數

cnTomato / 737人閱讀

摘要:返回的遍歷器對象,可以依次遍歷函數內部的每一個狀態。方法調用遍歷器對象的方法,使得指針移向下一個狀態。運行結果就是使用一個遍歷器,遍歷了多個函數,有遞歸的效果。

1、Generator簡介

基本概念

Generator函數有多種理解角度。從語法上,首先可以把它理解成,Generator函數是一個狀態機,封裝了多個內部狀態。

執行Generator函數會返回一個遍歷器對象,也就是說,Generator函數除了狀態機,還是一個遍歷器對象生成函數。返回的遍歷器對象,可以依次遍歷Generator函數內部的每一個狀態。

形式上,Generator函數是一個普通函數,但是有兩個特征。一是,function命令與函數名之間有一個星號;二是,函數體內部使用yield語句,定義不同的內部狀態(yield語句在英語里的意思就是“產出”)。

"use strict";
function * helloWorldGenerator() {
    yield "hello";
    yield "world";
    return "ending";
}
let hw = helloWorldGenerator();

上面代碼定義了一個Generator函數helloWorldGenerator,它內部有兩個yield語句“hello”“world”,即該函數有三個狀態:helloworldreturn語句(結束執行)。

然后,Generator函數的調用方法與普通函數一樣,也是在函數名后面加上一對圓括號。不同的是,調用Generator函數后,該函數并不執行,返回的也不是函數運行結果,而是一個指向內部狀態的指針對象,遍歷器對象(Iterator Object)。

2、next方法

調用遍歷器對象的next方法,使得指針移向下一個狀態。也就是說,每次調用next方法,內部指針就從函數頭部或上一次停下來的地方開始執行,直到遇到下一個yield語句(或return語句)為止。換言之,Generator函數是分段執行的,yield語句是暫停執行的標記,而next方法可以恢復執行。

hw.next()
// { value: "hello", done: false }
hw.next()
// { value: "world", done: false }
hw.next()
// { value: "ending", done: true }
hw.next()
// { value: undefined, done: true }

上面代碼一共調用了四次next方法。

第一次調用,Generator函數開始執行,直到遇到第一個yield語句為止。next方法返回一個對象,它的value屬性就是當前yield語句的值hellodone屬性的值false,表示遍歷還沒有結束。

第二次調用,Generator函數從上次yield語句停下的地方,一直執行到下一個yield語句。next方法返回的對象的value屬性就是當前yield語句的值worlddone屬性的值false,表示遍歷還沒有結束。

第三次調用,Generator函數從上次yield語句停下的地方,一直執行到return語句(如果沒有return語句,就執行到函數結束)。next方法返回的對象的value屬性,就是緊跟在return語句后面的表達式的值(如果沒有return語句,則value屬性的值為undefined),done屬性的值true,表示遍歷已經結束。

第四次調用,此時Generator函數已經運行完畢,next方法返回對象的value屬性為undefineddone屬性為true。以后再調用next方法,返回的都是這個值。

總結一下,調用Generator函數,返回一個遍歷器對象,代表Generator函數的內部指針。以后,每次調用遍歷器對象的next方法,就會返回一個有著valuedone兩個屬性的對象。value屬性表示當前的內部狀態的值,是yield語句后面那個表達式的值;done屬性是一個布爾值,表示是否遍歷結束。

3、yield*語句

用來在一個Generator函數里面執行另一個Generator函數,我們需要用yield*語句。

如果yield命令后面跟的是一個遍歷器對象,需要在yield命令后面加上星號,表明它返回的是一個遍歷器對象。這被稱為yield*語句。

"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

運行結果就是使用一個遍歷器,遍歷了多個Generator函數,有遞歸的效果。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/83639.html

相關文章

  • 【重溫基礎】13.迭代器和生成器

    摘要:迭代器和生成器將迭代的概念直接帶入核心語言,并提供一種機制來自定義循環的行為。本文主要會介紹中新增的迭代器和生成器。屬性本身是函數,是當前數據結構默認的迭代器生成函數。 本文是 重溫基礎 系列文章的第十三篇。今日感受:每次自我年終總結,都會有各種情緒和收獲。 系列目錄: 【復習資料】ES6/ES7/ES8/ES9資料整理(個人整理) 【重溫基礎】1.語法和數據類型 【重溫基礎】2.流...

    ymyang 評論0 收藏0
  • 【HEXO】從零搭建HEXO博客 修改默認主題/參數/favicon 替換個人主頁

    摘要:下面我以主題舉例,覆蓋默認主題。其他元素使用相同的方法都可以修改。像這種超鏈接跳轉的修改,在文件中找到直接把屬性的值改變即可。 準備:搭建環境 大致分為以下兩步: 安裝Node.js 安裝git 配置Node.js環境 下載Node.js安裝 Windows Installer 32-bithttps://nodejs.org/dist/v4.2.3/node-v4.2.3-x...

    My_Oh_My 評論0 收藏0
  • 【HEXO】從零搭建HEXO博客 修改默認主題/參數/favicon 替換個人主頁

    摘要:下面我以主題舉例,覆蓋默認主題。其他元素使用相同的方法都可以修改。像這種超鏈接跳轉的修改,在文件中找到直接把屬性的值改變即可。 準備:搭建環境 大致分為以下兩步: 安裝Node.js 安裝git 配置Node.js環境 下載Node.js安裝 Windows Installer 32-bithttps://nodejs.org/dist/v4.2.3/node-v4.2.3-x...

    Near_Li 評論0 收藏0
  • 開始學習koa

    摘要:對已經躍躍欲試很久,恰遇最近正式發布,今天嘗試著倒騰一番。所以自己對的學習算是從開始,由于文檔資源還不完全,準備踩著前輩們的肩膀,慢慢入坑。常識入門級程序與大部分程序員同胞一樣樣的習慣,寫一發慰藉自己孤寂的心靈。 對koa已經躍躍欲試很久,恰遇koa2最近正式發布,今天嘗試著倒騰一番。所以自己對koa的學習算是從2.x開始,由于文檔資源還不完全,準備踩著前輩們的肩膀,慢慢入坑。 環境的...

    KunMinX 評論0 收藏0
  • eslint V4.1.1 規則簡介

    摘要:規則簡介花了一天整理的,可能部分翻譯的有錯誤,后面會再校對一次規則說明默認情況下不會啟用任何規則。 eslint V4.1.1 規則簡介 花了一天整理的,可能部分翻譯的有錯誤,后面會再校對一次 規則說明:默認情況下不會啟用任何規則。配置文件中的extends:eslint:recommended屬性可以啟用一些默認的驗證規則,默認的規則在下表會用R表示出來 使用--fix命令可以自動修...

    tuomao 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<