ES6之生成器(Generator)

2021-08-10 13:37:13 字數 4210 閱讀 6116

目錄:

深入理解

新語法 yield

生成器與協程

通過一段程式,持續迭代或列舉出符合某個公式或演算法的有序數列中的元素。

function* fibo()}

let generator = fibo();

for(let i = 0; i < 10; i++)

生成器函式和普通函式的語法差別在於,在 function 語句之後和函式名之前有乙個「*」作為生成器函式的標示符。

function* fibo()
生成器函式也可以使用表示式進行定義:

const fnname = function* ()
yield 語句的作用與 return 語句有些相似,但並非退出函式體,而是切出當前函式的執行時(此處為乙個類的協程,semi-coroutime),與此同時可以將乙個值(可以是任何型別)帶到主線程中。

生成器是一種類協程或半協程(semi-coroutine),它提供了一種可以通過特定語句或方法使其執行物件(execution)暫停的功能,而這語句一般都是yield 語句

在 es6 中,yield 語句可以將乙個值帶出協程,而主線程也可以通過生成器物件的方法將乙個值帶回生成器的執行物件中去。

const inputvalue = yield outputvalue;
生成器切出執行物件並帶出outputvalue ,主線程經過同步或非同步處理後,通過 .next(val) 方法將 inputvalue帶回生成器的執行物件中。a2

=2,a

n=an

−12a

n−1+

1(n≥

2)

function* genfn

()}

在定義首項為2之後,首先將首項通過 yield 作為第乙個值切出,其後通過迴圈和公式將每一項輸出。

生成器函式不能直接作為普通函式來使用,因為在呼叫時無法直接執行其中的邏輯**。執行生成器函式會返回乙個生成器物件,用於執行生成器內容和接受其中的值。

const gen =genfn();

生成器是通過生成器函式實現的乙個生成器(類)例項

偽**:

class

generator

生成器類語法與內容操作方法(語法)

方法內容

generator.next(value)

獲取下乙個生成器切出狀態(第一次執行時為第乙個切出狀態)

generator.throw(error)

向當前生成器執行物件丟擲乙個錯誤,並終止生成器的執行

generator[@@iterator]

@@iterator即 symbol.iterator,為生成器提供實現可迭代物件的方法,使其可以直接被 for-of 迴圈語句使用

其中.next(value)方法會返回乙個狀態物件,包含當前生成器的執行狀態和所返回的

生成器執行物件會不斷檢查生成器的狀態,一旦遇到生成器內的最後乙個 yield 語句第乙個 return 語句便會進入終止狀態,即狀態物件中的 done 屬性會從 false 變為 true

.throw(error)方法會提前讓生成器進入終止狀態,並將 error 作為錯誤丟擲

生成器物件自身也是一種可迭代物件,我們直接使用for-of 迴圈便可遍歷。

// 檢測生成器函式

function

isgeneratorfunction

(fn)).constructor;

return fn instanceof genfn;

}console.log(isgeneratorfunction(genfn)); // true

// 檢測生成器例項物件

function

isgenerator

(obj)

console.log(isgenerator(gen)); // true

console.log(isgenerator({})); // false

使用@@tostringtag屬性來對生成器函式進行型別檢測。

// 優化版

function

isgeneratorfunction

(fn)

// using instanceof statement for detecting

const genfn = (function* (){}).constructor;

return fn instanceof genfn;

}

它和 yield 的區別在於, yield* 的功能是將乙個生成器物件巢狀在另乙個生成器內,並將其展開。

function* foo

()function* bar

()for(const n of bar()) console.log(n);

// 1

// 2

// 3

// 4

為了實現以生成器作為邏輯執行主體,把非同步方法帶到主線程去,就要先將非同步函式做一層包裝,使得其可以在帶出生成器執行物件之後再執行。

// before

function

echo

(content, callback)

// after

function

echo

(content)

}

將方法帶出生成器執行物件後,還需要在主線程將帶出的函式執行。上面我們通過封裝所得到的非同步方法再生成器內部執行後,可以通過 yield 語句將內層的函式帶到主線程中,這樣就可以在主線程中執行這個函式並得到返回值,然後將其返回到生成器執行物件中。

function run(genfn))

}// first

call

next

();}

run(function* () world`);

console.log(msg2); // hello world

})

ES6新特性之生成器函式 generator

一 什麼是生成器函式?生成器函式是es6的新特性之一,它是乙個在執行時能中途暫時退出,後面重新呼叫又能重新進入繼續執行的一種函式。並且在函式內定義的變數的所有狀態不受中途退出的影響。二 語法 宣告方式 function 函式名 引數1 引數2 引數n 呼叫說明 1 呼叫生成器物件時會返回乙個生成器的...

JS之ES6生成器

generator 生成器 是 es6 標準引入的新的資料型別。乙個 generator 看上去像乙個函式,但可以返回多次。generator 函式和普通的函式區別有兩個,1 function 和函式名之間有乙個 號,2 函式體內部使用了 yield 表示式 呼叫生成器函式和呼叫 普通函式不同,呼叫...

ES6中的Generator生成器

generator函式,可以通過yield關鍵字,將函式掛起,為了改變執行流提供了可能性,同時為了做非同步程式設計提供了方案 generator函式是分段執行的,yield是暫停執行,next 是恢復執行 1.function後面函式名之前有個 2.只能在函式內部使用yield表示式讓函式掛起,yi...