溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

ES6的Generator函數(shù)執(zhí)行機(jī)制是什么

發(fā)布時間:2021-12-20 14:52:20 來源:億速云 閱讀:118 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“ES6的Generator函數(shù)執(zhí)行機(jī)制是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“ES6的Generator函數(shù)執(zhí)行機(jī)制是什么”吧!

ES6 新引入了 Generator 函數(shù),可以通過 yield 關(guān)鍵字,把函數(shù)的執(zhí)行流掛起,為改變執(zhí)行流程提供了可能,從而為異步編程提供解決方案。

Generator 函數(shù)組成

Generator 有兩個區(qū)分于普通函數(shù)的部分

一是在 function 后面,函數(shù)名之前有個 * ;

函數(shù)內(nèi)部有 yield 表達(dá)式。

其中 * 用來表示函數(shù)為 Generator 函數(shù),yield 用來定義函數(shù)內(nèi)部的狀態(tài)。

function* func(){ console.log("one"); yield '1'; console.log("two"); yield '2'; 
 console.log("three"); return '3';}

執(zhí)行機(jī)制

調(diào)用 Generator 函數(shù)和調(diào)用普通函數(shù)一樣,在函數(shù)名后面加上()即可,但是 Generator 函數(shù)不會像普通函數(shù)一樣立即執(zhí)行,而是返回一個指向內(nèi)部狀態(tài)對象的指針,所以要調(diào)用遍歷器對象Iterator 的 next 方法,指針就會從函數(shù)頭部或者上一次停下來的地方開始執(zhí)行。

f.next();// one// {value: "1", done: false} f.next();// two// {value: "2", done: false} f.next();// three// {value: "3", done: true} f.next();// {value: undefined, done: true}

第一次調(diào)用 next 方法時,從 Generator 函數(shù)的頭部開始執(zhí)行,先是打印了 one ,執(zhí)行到 yield 就停下來,并將yield 后邊表達(dá)式的值 '1',作為返回對象的 value 屬性值,此時函數(shù)還沒有執(zhí)行完, 返回對象的 done 屬性值是 false。

第二次調(diào)用 next 方法時,同上步 。

第三次調(diào)用 next 方法時,先是打印了 three ,然后執(zhí)行了函數(shù)的返回操作,并將 return 后面的表達(dá)式的值,作為返回對象的 value 屬性值,此時函數(shù)已經(jīng)結(jié)束,多以 done 屬性值為true 。

第四次調(diào)用 next 方法時, 此時函數(shù)已經(jīng)執(zhí)行完了,所以返回 value 屬性值是 undefined ,done 屬性值是 true 。如果執(zhí)行第三步時,沒有 return 語句的話,就直接返回 {value: undefined, done: true}。

函數(shù)返回的遍歷器對象的方法

next 方法

一般情況下,next 方法不傳入?yún)?shù)的時候,yield 表達(dá)式的返回值是 undefined 。當(dāng) next 傳入?yún)?shù)的時候,該參數(shù)會作為上一步y(tǒng)ield的返回值。

next不傳參

除了使用 next ,還可以使用 for... of 循環(huán)遍歷 Generator 函數(shù)生產(chǎn)的 Iterator 對象。

return 方法

return 方法返回給定值,并結(jié)束遍歷 Generator 函數(shù)。

return 方法提供參數(shù)時,返回該參數(shù);不提供參數(shù)時,返回 undefined 。

遍歷器對象拋出了兩個錯誤,第一個被 Generator 函數(shù)內(nèi)部捕獲,第二個因為函數(shù)體內(nèi)部的catch 函數(shù)已經(jīng)執(zhí)行過了,不會再捕獲這個錯誤,所以這個錯誤就拋出 Generator 函數(shù)體,被函數(shù)體外的 catch 捕獲。

yield* 表達(dá)式

yield* 表達(dá)式表示 yield 返回一個遍歷器對象,用于在 Generator 函數(shù)內(nèi)部,調(diào)用另一個 Generator 函數(shù)。

使用場景

實現(xiàn) Iterator

為不具備 Iterator 接口的對象提供遍歷方法。

Reflect.ownKeys() 返回對象所有的屬性,不管屬性是否可枚舉,包括 Symbol。
jane 原生是不具備 Iterator 接口無法通過 for... of遍歷。這邊用了 Generator 函數(shù)加上了 Iterator 接口,所以就可以遍歷 jane 對象了。

到此,相信大家對“ES6的Generator函數(shù)執(zhí)行機(jī)制是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI