国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

js中Generator函數的深入講解

2024-05-06 15:41:00
字體:
來源:轉載
供稿:網友

前言

Generator函數是es6提供的一種異步編程的解決方案,語法行為與傳統函數完全不一樣。

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

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

下面話不多說了,來一起看看詳細的介紹吧

語法上

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

形式上

Generator 函數是一個普通函數,但是有兩個特征。

 一是,function關鍵字與函數名之間有一個星號;
 二是,函數體內部使用yield表達式,定義不同的內部狀態(yield在英語里的意思就是“產出”)。

調用上

Generator 函數的調用方法與普通函數一樣,也是在函數名后面加上一對圓括號。不同的是,調用 Generator 函數后,該函數并不執行,返回的也不是函數運行結果,而是一個指向內部狀態的指針對象,也就是上一章介紹的遍歷器對象(Iterator Object)。我們必須調用遍歷器對象的next方法,使得指針移向下一個狀態。也就是說,每次調用next方法,內部指針就從函數頭部或上一次停下來的地方開始執行,直到遇到下一個yield表達式(或return語句)為止。換言之,Generator 函數是分段執行的,yield表達式是暫停執行的標記,而next方法可以恢復執行

function* helloWorldGenerator() { yield 'hello'; yield 'world'; return 'ending';}var hw = helloWorldGenerator();hw.next()// { value: 'hello', done: false }hw.next()// { value: 'world', done: false }hw.next()// { value: 'ending', done: true }hw.next()// { value: undefined, done: true }

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

yield表達式

yield表達式與return語句既有相似之處,也有區別。相似之處在于,都能返回緊跟在語句后面的那個表達式的值。區別在于每次遇到yield,函數暫停執行,下一次再從該位置繼續向后執行,而return語句不具備位置記憶的功能。一個函數里面,只能執行一次(或者說一個)return語句,但是可以執行多次(或者說多個)yield表達式。正常函數只能返回一個值,因為只能執行一次return;Generator 函數可以返回一系列的值,因為可以有任意多個yield。從另一個角度看,也可以說 Generator 生成了一系列的值,這也就是它的名稱的來歷(英語中,generator 這個詞是“生成器”的意思)。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 花垣县| 东兰县| 兴城市| 共和县| 普宁市| 威远县| 雷州市| 崇信县| 淳化县| 古蔺县| 定州市| 通州市| 济阳县| 天峻县| 高雄县| 赤峰市| 拉萨市| 特克斯县| 绥阳县| 九龙坡区| 马山县| 洛扎县| 通州区| 综艺| 京山县| 东乡族自治县| 石城县| 贵德县| 吉林省| 同江市| 城固县| 汾西县| 阿尔山市| 资兴市| 雷波县| 新民市| 洪雅县| 拜城县| 孙吴县| 江门市| 揭东县|