介绍
function* 这种声明方式(function
关键字后跟一个星号)会定义一个生成器函数 (generator function),它返回一个 Generator
对象。
一般地,生成器函数是这么使用的:
function* generator(i) {
let a= yield i;
yield i+ 10;
}
var gen = generator(10);
console.log(gen.next().value);
// expected output: 10
console.log(gen.next().value);
// expected output: 20
其实这种生成器函数,可以把它理解成一种特殊的函数。
核心总结
- 一般function* name(){}要和yield配合使用
- 这种函数的函数体一般不会立即执行,它需要通过返回的generator对象使用next(),来执行。
- 每当执行一次next(),生成器函数内的代码就会执行到下一个yield所在行,当执行下一次next()时,就会继续执行到下一个yield所在行。
- 这个Generator对象包含一个value和一个done,value代表对应yield右边的值,done是布尔值代表是否执行结束。
- 其实next()也可以传递一个参数如next(30),代表运行此行代码时,会先更改上一行代码的yield左边的值a,然后再继续运行。
- 如果你看到某个生成器函数里是yeild*而不是yeild,那么它的右边一般是另一个生成器函数,意味着将原函数的执行权移交给另一个生成器函数。
- 如果生成器函数里使用了return显式返回,那么代码就运行到return处不会再往下运行,此事done变成false。