Generator函式的語法和應用

2021-09-24 05:35:13 字數 2452 閱讀 7084

基本概念

狀態機,封裝了多個內部狀態;

返回乙個遍歷器物件,通過改物件可以一次遍歷generator函式內部的每乙個狀態

帶*號,yeild表示式定義不同的內部狀態;

呼叫 generator 函式後,該函式並不執行,返回的也不是函式執行結果,而是乙個指向內部狀態的指標物件,也就是遍歷器物件;

generator 函式是分段執行的,yield表示式是暫停執行的標記,而next方法可以恢復執行;

暫停標誌

next()方法允許邏輯

遇到yield表示式,就暫停執行後面的操作,並將緊跟在yield後面的那個表示式的值,作為返回的物件的value屬性值;

下一次呼叫next方法時,再繼續往下執行,直到遇到下乙個yield表示式;

沒有再遇到新的yield表示式,就一直執行到函式結束,直到return語句為止,並將return語句後面的表示式的值,作為返回的物件的value屬性值;

如果該函式沒有return語句,則返回的物件的value屬性值為undefined;

yield表示式只能用在 generator 函式裡面,用在其他地方都會報錯。

var arr = [1, [[2, 3], 4], [5, 6]];

var flat = function* (a) else

});};

for (var f of flat(arr))

複製**使用for迴圈改正

var arr = [1, [[2, 3], 4], [5, 6]];

var flat = function* (a) else }};

for (var f of flat(arr)) // 1, 2, 3, 4, 5, 6

複製**

yield表示式如果用在另乙個表示式之中,必須放在圓括號裡面;

yield表示式用作函式引數或放在賦值表示式的右邊,可以不加括號

與iterator的關係

可以把 generator 賦值給物件的symbol.iterator屬性,從而使得該物件具有 iterator 介面

var myiterable = {};

myiterable[symbol.iterator] = function* () ;

[…myiterable] // [1, 2, 3]

複製**next()方法的引數

yield表示式本身沒有返回值,或者說總是返回undefined。next方法可以帶乙個引數,該引數就會被當作上乙個yield表示式的返回值。

function* f() }}

var g = f();

g.next() //

g.next() //

g.next(true) //

複製**generator 函式從暫停狀態到恢復執行,它的上下文狀態(context)是不變的。通過next方法的引數,就有辦法在 generator 函式開始執行之後,繼續向函式體內部注入值。也就是說,可以在 generator 函式執行的不同階段,從外部向內部注入不同的值,從而調整函式行為。

分析以下**允許的結果:

function* foo(x)

var a = foo(5);

a.next() // object

a.next() // object

a.next() // object

var b = foo(5);

b.next() //

b.next(12) //

b.next(13) //

複製**next()傳參,引數代表上一次yeild表示式返回的值,因此第一次使用next()傳參是無效的;

function* dataconsumer() );

console.log(2. $);

return 『result』;

}for (let v of foo())

// 1 2 3 4 5

複製**這裡需要注意,一旦next方法的返回物件的done屬性為true,for…of迴圈就會中止;

generator給物件新增iterator

方法一function* objectentries(obj)

}let jane = ;

for (let [key, value] of objectentries(jane)) : $);

}// first: jane

// last: doe

複製**

方法二將 generator 函式加到物件的symbol.iterator屬性上面。

function* objectentries()

}let jane = ;

jane[symbol.iterator] = objectentries;

for (let [key, value] of jane) : $);

}// first: jane

// last: doe

16 1 0 generator函式的語法

一 generator是es6提供的一種非同步程式設計解決方案,執行語法跟傳統函式完全不同 二 1 語法上看,理解成乙個狀態機,封裝了多個內部狀態 2 形式上看,generator是乙個普通的函式,但是具備2個特徵 a 星號 b 函式體內可以使用多個yield語句定義不同的內部狀態 三 1 執行ge...

迭代函式 Generator函式的理解

一 基本用法 generator函式跟普通函式在寫法上的區別就是,多了乙個星號 並且只有在generator函式中才能使用yield 什麼是yield呢,他相當於generator函式執行的中途暫停點,比如下方有3個暫停點。而怎麼才能暫停後繼續走呢?那就得使用到next方法,next方法執行後會返回...

Generator函式與async函式的區別介紹

generator函式 generator函式是es2015提供的非同步解決方案,與普通函式有很大的不同 特徵 1 在function關鍵字後面跟乙個 號 2 在函式體內部使用yield表示式作為乙個狀態 generator函式返回乙個遍歷器,可通過for of方法遍歷每個狀態 用法 執行gener...