生成器函式generator function 用function *name () {}
來宣告,呼叫生成器函式則會返回乙個生成器物件generator,並且符合可迭代協議和迭代器協議,因此generator也是乙個迭代器物件,具有next()方法,呼叫next()方法會執行生成器函式內的語句(即遍歷生成器函式內部的狀態,狀態值由yield後的表示式值給出)。
function *foo ( x )
var it = foo(3); // x = 3; 首次呼叫生成器函式返回乙個物件,具有next()方法的迭代器物件;
it.next().value; // 1 ;呼叫next方法來遍歷狀態,在遇到yield語句時停下來,返回具有形式的物件,其中value值是yield後的表示式值,done表示迭代是否結束;
it.next().value; // 2 第二次呼叫next方法,從上次yield停下來的地方繼續執行,注意上一次只執行yield及其表示式,如果yield表示式包含在語句中,則該語句不會執行,直到再次被啟動;
it.next(4).value; // undefined; y = 7; 第三次呼叫next方法時傳入乙個值,yield表示式可以接收值,也可以生成值,生成的值會被next方法返回,接受的值由next方法傳入作為整個yield表示式的值,所以此時y = 3 + 4; 然後繼續執行到下乙個yield處(var z = y + (yield) ),由於yield後沒有值,所以生成值為undefined;
it.next(5).value; // undefined; z = 12; 第四次呼叫next方法傳入5,可以得到z = 7 + 5; 執行到return結束,返回物件為;
每次呼叫生成器函式構建迭代器時,同時隱式構建了生成器例項,迭代器對應執行的是新的生成器例項,因此可以構建多個迭代器來控制對應生成器例項,互相之間並不會干擾。比如
function *bar ()
var it1 = bar();
var it2 = bar();
it1.next(); //
it2.next(); // ,並非
利用生成器例項的暫停執行機制,可以控制多個生成器函式交替執行,如果這些函式有共享的變數,則可以模仿多執行緒競態條件環境。
for of遍歷方法
典型的for of遍歷寫法for (let v of something)
,其中something是迭代器物件,或者具有[symbol.iterator]屬性的物件,如陣列,map集合和set集合,而v則是迭代器物件呼叫next方法返回物件的value屬性值;for of結構中迭代器物件自動呼叫next方法,直到返回物件的done屬性值為true;
如果生成器函式內部有無限多個狀態,如
function *foo () else
yield nextval;
}}
利用for ( let v of foo())
則會一直無限迴圈下去,那麼如何讓生成器停止呢?
給for of新增break、return語句;for of結構在遇到break、return或者有異常時,並非會掛起狀態,而是會向迭代器物件傳送乙個訊號使其終止;break和return會觸發執行生成器內部的finally語句;
var it = foo();
for ( let v of it ) ;
}}
注意:在可迭代物件(如陣列,map和set集合)中,迭代物件並沒有return方法,只有next方法,這一點跟生成器函式返回的迭代物件有區別;如
var arr = [1, 2, 500, 600,3, 4];
var it = arr[symbol.iterator]();
for(let v of it) }1
2 500
600
typeerror: it.return is not a function
ES6中的迭代器和生成器
什麼是迭代器 迭代器是一種特殊物件,它具有一些專門為迭代過程設計的專有介面,所有的迭代器物件都有乙個next 方法,每次呼叫都返回乙個結果物件。結果物件有兩個屬性 乙個是value,表示下乙個將要返回的值 另乙個是done,它是乙個布林型別的值,當沒有更多可返回資料時返回true。迭代器還會儲存乙個...
ES6的迭代器和生成器
在es6之前,遍歷陣列都需要使用for迴圈,通過變數來跟蹤陣列的索引。如果多個迴圈巢狀就需要追蹤多個變數,複雜度會大大增加,也容易產生錯用迴圈變數的bug。es6 引入了乙個全新的迭代器的概念,它提供一種方法能夠順序訪問乙個聚合物件中的各個元素,而不需要暴露該物件的內部表現。es6 對迭代器物件的定...
ES6中的Generator生成器
generator函式,可以通過yield關鍵字,將函式掛起,為了改變執行流提供了可能性,同時為了做非同步程式設計提供了方案 generator函式是分段執行的,yield是暫停執行,next 是恢復執行 1.function後面函式名之前有個 2.只能在函式內部使用yield表示式讓函式掛起,yi...