Fork me on GitHub

生成器函数

本节主要讲述生成器函数

生成器函数

一个简单的例子

1
2
3
4
5
6
7
8
9
10
11
function* one(){
yield "one"
yield "two"
yield "three"
}

var weaponsIter = one();
console.log(weaponsIter.next().value) //"one"
console.log(weaponsIter.next().value) //"two"
console.log(weaponsIter.next().value) //"three"
console.log(weaponsIter.next().done) //undefined

迭代器对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function* one() {
yield "one"
yield two()
yield "three"
}

function* two() {
yield "two"
}

var weaponsIter = one();
console.log(weaponsIter.next().value)
console.log(weaponsIter.next().value)
console.log(weaponsIter.next().value)
console.log(weaponsIter.next().done)

var weaponsIter = one();调用生成器得到一个迭代器对象

第一次调用生成器的next()方法让生成器代码执行到第一个yield表达式

交互

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function* Ninja(action){
const imposter = yield ("第一个参数--"+action)

/* imposter作为第二次yield的参数,是下次要用到的参数 */

yield ("第二个参数--"+imposter)
}

const iterator = Ninja("Qian");

const result1 = iterator.next()
const result2 = iterator.next("Wei")

console.log(result1.value)
console.log(result2.value)

生成器内部构成

调用一个生成器不会实际的执行它,相反,它创建一个新的迭代器,通过该迭代器我们才能从生成器中请求值。

在生成器生成了一个值后,生成器会挂起执行并等待下一下请求的到来。

  • 挂起开始:创建一个生成器后,他最先以这种状态开始,其中任何·代码都未执行
  • 执行:生成器中的代码已执行。执行要么刚开始,要么是从上次挂起的时候继续的。
  • 挂起让渡:当生成器在执行过程中遇到一个yield表达式,它会创建一个包含返回值的新对象,岁后再次挂起
  • 完毕:在生成器执行期间,如果代码执行到return语句或者全部代码执行完比,生成器就会进入该状态