ES6 Generator 生成器 函式

2022-05-12 20:10:27 字數 2431 閱讀 4581

es6 新引入了 generator 函式,可以通過 yield 關鍵字,把函式的執行流掛起,為改變執行流程提供了可能,從而為非同步程式設計提供解決方案。 基本用法

generator 有兩個區分於普通函式的部分:

其中 * 用來表示函式為 generator 函式,yield 用來定義函式內部的狀態。

function*func()

呼叫 generator 函式和呼叫普通函式一樣,在函式名後面加上()即可,但是 generator 函式不會像普通函式一樣立即執行,而是返回乙個指向內部狀態物件的指標,所以要呼叫遍歷器物件iterator 的 next 方法,指標就會從函式頭部或者上一次停下來的地方開始執行。

var f=new func();

f.next();

//one

//two

//three

//

從 generator 函式的頭部開始執行,先是列印了 one ,執行到 yield 就停下來,並將yield 後邊表示式的值 '1',作為返回物件的 value 屬性值

next 方法

一般情況下,next 方法不傳入引數的時候,yield 表示式的返回值是 undefined 。當 next 傳入引數的時候,該引數會作為上一步yield的返回值。

function*sendparameter()

next不傳參

var sendp1 =sendparameter();

sendp1.next();

//strat

//one:undefined

//two:undefined

//total:nan

//

next傳參

var sendp2 =sendparameter();

sendp2.next(10);

//strat

//one:20

//two:30

//total:50

//

除了使用 next ,還可以使用 for... of 迴圈遍歷 generator 函式生產的 iterator 物件。

return 方法

return 方法返回給定值,並結束遍歷 generator 函式。

return 方法提供引數時,返回該引數;不提供引數時,返回 undefined 。

function*foo()

var f =foo();

f.next();

"foo");

//throw

方法throw

方法可以再 generator 函式體外面丟擲異常,再函式體內部捕獲。

var g = function*()

catch

(e) };

var i =g();

i.next();

trycatch

(e)

//catch inner a

//catch outside b

遍歷器物件丟擲了兩個錯誤,第乙個被 generator 函式內部捕獲,第二個因為函式體內部的catch 函式已經執行過了,不會再捕獲這個錯誤,所以這個錯誤就丟擲 generator 函式體,被函式體外的 catch 捕獲。

yield* 表示式

yield* 表示式表示 yield 返回乙個遍歷器物件,用於在 generator 函式內部,呼叫另乙個 generator 函式。

function*callee() 

function*caller()

}const callerobj =caller();

callerobj.next();

"a");

//callee: a

"b");

//callee: b

////

等同於function*caller()

}}

實現 iterator

為不具備 iterator 介面的物件提供遍歷方法。

function*objectentries(obj) } 

const jane = ;

for(const [key,value] of objectentries(jane)) : $`);}//

first: jane

//last: doe

reflect.ownkeys() 返回物件所有的屬性,不管屬性是否可列舉,包括 symbol。

json 物件是不具備 iterator 介面無法通過 for... of遍歷。這邊用了 generator 函式加上了 iterator 介面,所以就可以遍歷 json 物件了

ES6之生成器(Generator)

目錄 深入理解 新語法 yield 生成器與協程 通過一段程式,持續迭代或列舉出符合某個公式或演算法的有序數列中的元素。function fibo let generator fibo for let i 0 i 10 i 生成器函式和普通函式的語法差別在於,在 function 語句之後和函式名之...

ES 生成器Generator函式

1 generator函式的特徵 2 生成器函式與普通函式呼叫方法一樣,不同的是,呼叫生成器函式後,該函式並不執行,返回的也不是函式執行結果,而是乙個指向內部狀態的指標物件,即遍歷器物件 3 next方法用於取出generator函式中的值 4 每次呼叫next方法,內部指標就從函式頭部或上一次停下...

ES6中的Generator生成器

generator函式,可以通過yield關鍵字,將函式掛起,為了改變執行流提供了可能性,同時為了做非同步程式設計提供了方案 generator函式是分段執行的,yield是暫停執行,next 是恢復執行 1.function後面函式名之前有個 2.只能在函式內部使用yield表示式讓函式掛起,yi...