摘要:返回的遍歷器對象,可以依次遍歷函數內部的每一個狀態。方法調用遍歷器對象的方法,使得指針移向下一個狀態。運行結果就是使用一個遍歷器,遍歷了多個函數,有遞歸的效果。
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”,即該函數有三個狀態:hello,world和return語句(結束執行)。
然后,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語句的值hello,done屬性的值false,表示遍歷還沒有結束。
第二次調用,Generator函數從上次yield語句停下的地方,一直執行到下一個yield語句。next方法返回的對象的value屬性就是當前yield語句的值world,done屬性的值false,表示遍歷還沒有結束。
第三次調用,Generator函數從上次yield語句停下的地方,一直執行到return語句(如果沒有return語句,就執行到函數結束)。next方法返回的對象的value屬性,就是緊跟在return語句后面的表達式的值(如果沒有return語句,則value屬性的值為undefined),done屬性的值true,表示遍歷已經結束。
第四次調用,此時Generator函數已經運行完畢,next方法返回對象的value屬性為undefined,done屬性為true。以后再調用next方法,返回的都是這個值。
總結一下,調用Generator函數,返回一個遍歷器對象,代表Generator函數的內部指針。以后,每次調用遍歷器對象的next方法,就會返回一個有著value和done兩個屬性的對象。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
摘要:迭代器和生成器將迭代的概念直接帶入核心語言,并提供一種機制來自定義循環的行為。本文主要會介紹中新增的迭代器和生成器。屬性本身是函數,是當前數據結構默認的迭代器生成函數。 本文是 重溫基礎 系列文章的第十三篇。今日感受:每次自我年終總結,都會有各種情緒和收獲。 系列目錄: 【復習資料】ES6/ES7/ES8/ES9資料整理(個人整理) 【重溫基礎】1.語法和數據類型 【重溫基礎】2.流...
摘要:下面我以主題舉例,覆蓋默認主題。其他元素使用相同的方法都可以修改。像這種超鏈接跳轉的修改,在文件中找到直接把屬性的值改變即可。 準備:搭建環境 大致分為以下兩步: 安裝Node.js 安裝git 配置Node.js環境 下載Node.js安裝 Windows Installer 32-bithttps://nodejs.org/dist/v4.2.3/node-v4.2.3-x...
摘要:下面我以主題舉例,覆蓋默認主題。其他元素使用相同的方法都可以修改。像這種超鏈接跳轉的修改,在文件中找到直接把屬性的值改變即可。 準備:搭建環境 大致分為以下兩步: 安裝Node.js 安裝git 配置Node.js環境 下載Node.js安裝 Windows Installer 32-bithttps://nodejs.org/dist/v4.2.3/node-v4.2.3-x...
摘要:規則簡介花了一天整理的,可能部分翻譯的有錯誤,后面會再校對一次規則說明默認情況下不會啟用任何規則。 eslint V4.1.1 規則簡介 花了一天整理的,可能部分翻譯的有錯誤,后面會再校對一次 規則說明:默認情況下不會啟用任何規則。配置文件中的extends:eslint:recommended屬性可以啟用一些默認的驗證規則,默認的規則在下表會用R表示出來 使用--fix命令可以自動修...
閱讀 4396·2021-11-24 10:24
閱讀 1421·2021-11-22 15:22
閱讀 2052·2021-11-17 09:33
閱讀 2458·2021-09-22 15:29
閱讀 527·2019-08-30 15:55
閱讀 1667·2019-08-29 18:42
閱讀 2744·2019-08-29 12:55
閱讀 1785·2019-08-26 13:55