ECMAScript6新特性

生成器(generator)

历史渊源

起源于CLU语言

在以下语言中均有实现

  • Icon
  • python
  • C#
  • Ruby

基本概念

生成器函数

生成器函数是 ES2015 中生成器的最主要表现方式,它与普通的函数语法差别在
于,在 function 语句之后和函数名之前,有一个 * 作为它是一个生成器函数
的标示符。

function* fibo() {
  // ...
  yield
  yield
}
生成器函数的定义并不是强制性使用声明式的,与普通函数一样可以使用定义式
进行定义。

const fnName = function*() { /* ... */ }

基本概念

生成器

在 ES2015 中,yield 可以将一个值带出协程,而主线程也可以通过生成器对象的方法将一个值带回生成器的执行对象中去。

const inputValue = yield outputValue

生成器切出执行对象并带出 outputValue,主线程经过同步或异步的处理后,通过 .next(val)方法将 inputValue 带回生成器的执行对象中

使用方法

构建生成器函数

function* genFn() {
  let a = 2

  yield a

  while (true) {
    yield a = a / (2 * a + 1)
  }
}

启动生成器

使用方法


const gen = genFn()

运行生成器

使用方法

for (const a of gen) {
  if (a < 1/100) break

  console.log(a)
}

生成器嵌套

使用方法

function* foo() {
  yield 1
  yield 2
}

function* bar() {
  yield* foo()
  yield 3
  yield 4
}

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

一个小问题

使用方法

function *generator(i){
  var a = 3*(yield i+4)
  var b = yield a*3
  var c = yield b+10
  return d = a+b+c
}
var g = generator(2)

Q&A

ECMAScript6

By penouc

ECMAScript6

  • 886