---
tags: ES6, Javascript
disqus: hackmd
---
# [JS]Generators 生成器
[淺入淺出 Generator Function](https://denny.qollie.com/2016/05/08/es6-generator-func/)
[Generator 函数的语法](https://es6.ruanyifeng.com/#docs/generator)
[JavaScript ES6 Generators 生成器](https://www.fooish.com/javascript/ES6/generators.html)
[[JS] JavaScript Generator 的使用](https://pjchender.github.io/2017/09/26/js-javascript-generator-%E7%9A%84%E4%BD%BF%E7%94%A8/)
---
Generators (生成器) 是 ES6 引入的另一個新功能,Generators 像是一個可以隨時暫停 (pause) 和繼續 (resume) 執行的特殊函數,它會自動幫你維護一個內部狀態。
```javascript=
function* gen() {
yield 1;
yield 2;
yield 3;
}
var g = gen();
g.next() //{value: 1, done: false}
g.next() //{value: 2, done: false}
g.next() //{value: 3, done: false}
g.next() //{value: undefined, done: true}
```
上面是一個 Generator 的宣告,看起來就像是一般的函數,但有幾點不同:
Generator 函數裡面使用 yield 關鍵字,來定義和暫停不同的內部執行狀態
宣告一個 Generator 的關鍵字是*,function 關鍵字後面接著一個星號 \*,因為目前並未強制規定\*號的位置,所以以下四種寫法都被接受。
不過一般大多是使用第三種寫法,讓\*號緊跟在function後面
```javascript=
function * foo(x, y) { ··· }
function *foo(x, y) { ··· }
function* foo(x, y) { ··· }
function*foo(x, y) { ··· }
```
### next()、throw()、return()
這三個為Generator的方法,可以看這[Generator](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Generator)。
```javascript=
var gen = function* gen() {
try {
yield 1;
yield 2;
yield 3;
}
catch (e) {
console.log(e);
}
}
var g = gen();
g.next(); //{value: 1, done: false}
g.throw('error been catched'); //{value: undefined, done: true}
g.return(); //{value: undefined, done: true}
```