16 1 0 generator函式的語法

2021-08-14 15:39:21 字數 2441 閱讀 4689

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