基本概念
狀態機,封裝了多個內部狀態;
返回乙個遍歷器物件,通過改物件可以一次遍歷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...