一:generator是es6提供的一種非同步程式設計解決方案,執行語法跟傳統函式完全不同;
二:(1)語法上看,理解成乙個狀態機,封裝了多個內部狀態;
(2)形式上看,generator是乙個普通的函式,但是具備2個特徵:
a:星號
b:函式體內可以使用多個yield語句定義不同的內部狀態;
三 1:執行generator函式會返回乙個遍歷器物件;也就是說generator函式除了是乙個狀態機,還是乙個遍歷器物件生成函式;返回的的遍歷器物件的next方法也是乙個物件:如下:
2:可以用next方法依次遍歷generator函式內部的每個狀態;
function* gen(x)
var g = gen(1);
console.
log(g) // {}
console.
log(g.next()) //
console.
log(g.next()) //
console.
log(g) // {}
console.
log(g.next()) //
console.
log(g.next()) //
console.
log(g) // {}
3:下面的寫法直接報錯
function
gen(x)
注:第一次呼叫next後,y的值並不是3;所以第二次next以後,返回nan;
4:由於es6並沒有規定星號出現的位置,因此下面的寫法都是正確的,一般用第三種;
function * gen
(x){}
function *gen
(x){}
function* gen
(x){}
function*gen
(x){}
三:generator中的**不會立即執行,只有第一次呼叫next方法才會執行第一行**;下面的**2秒鐘執行才會列印結果
function* gen
() var generator=gen()
settimeout(function
() ,2000)
一:遍歷器對的next方法的執行邏輯如下:
1:遇到yield語句就暫停執行後面的操作,並且將緊跟在yield後的表示式的值作為返回的遍歷器物件的value值;done返回false
2:下一次呼叫next方法時,繼續往下執行,直到遇到下一條yield語句;done返回false
3:如果沒有遇到yield語句,就一直執行到函式結束;直到return語句;並且將return語句後面表示式的值作為返回物件的value值
4:如果沒有return語句,就將返回物件的value值返回undefined;done返回true
二:yield不能用在其他普通函式中;不然會報錯
var arr = [1, [[2, 3], 4], [5, 6]]
//語法錯誤:普通函式中使用yield表示式
// var flat = function* (a)
else
// })
// }
下面的**才是正解
var arr = [1, [[2, 3], 4], [5, 6]]
var flat = function* (a)
else
}}for(var f of flat(arr))
三:yield表示式如果在另外乙個表示式中,必須放在()中
function* deom
()
1:任何乙個物件的symbol.inetrator方法=該物件的遍歷器物件生成函式;呼叫該函式返回該物件的乙個遍歷器物件
2:由於generator函式就是遍歷器生成函式,因此可以把generator複製給物件的symbol.iterator屬性,從而使得改物件具有iterator介面;該介面可以被…運算子遍歷
var myiterable = {}
myiterable[symbol.iterator] = function* ()
console.log(myiterable) //
console.log(...myiterable) //1 2 3
3:generator函式執行後返回的遍歷器物件,也具有symbol.inetrator屬性,執行後返回自身;
function* gen()
var g=gen()
console.log(g[symbol.iterator]()===g) //true
Generator函式學習
例子1 const test function x const a test 1 console.log a.next 3 x 2 3 console.log a.next 11 22 3 2 11 3 console.log a.next 2 18 3 2 3 console.log a.next...
迭代函式 Generator函式的理解
一 基本用法 generator函式跟普通函式在寫法上的區別就是,多了乙個星號 並且只有在generator函式中才能使用yield 什麼是yield呢,他相當於generator函式執行的中途暫停點,比如下方有3個暫停點。而怎麼才能暫停後繼續走呢?那就得使用到next方法,next方法執行後會返回...
Generator函式與async函式的區別介紹
generator函式 generator函式是es2015提供的非同步解決方案,與普通函式有很大的不同 特徵 1 在function關鍵字後面跟乙個 號 2 在函式體內部使用yield表示式作為乙個狀態 generator函式返回乙個遍歷器,可通過for of方法遍歷每個狀態 用法 執行gener...