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...