---
# System prepended metadata

title: '[JS]Generators 生成器'
tags: [' Javascript', ES6]

---

---
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}
```

