78 lines
2.2 KiB
Markdown
78 lines
2.2 KiB
Markdown
---
|
|
title: 生成器函数
|
|
date: 2018-4-29 19:57:44
|
|
tags:
|
|
- JavaScript
|
|
- ECMAScript6
|
|
categories:
|
|
- JavaScript
|
|
---
|
|
`function *`声明可以用于定义一个生成器函数 , 它返回一个Generator对象
|
|
<!-- more -->
|
|
语法
|
|
<pre>
|
|
function * name([param[,param[,...param]]])
|
|
{ statement }
|
|
</pre>
|
|
|
|
生成器是一种可以从中退出后重新进入的函数
|
|
函数内部的局部变量会在每次执行后被保存 , 下次进入可以继续使用
|
|
|
|
调用生成器函数并不会执行它的主体 , 而是返回对应的一个Generator对象
|
|
当这个对象的`next()`方法被调用时 , 生成器函数的主体会被执行至第一个`yield`表达式 , 该表达式定义了生成器本次生成的值
|
|
next()方法返回一个对象
|
|
包含**value**属性 , 是本次生成的值
|
|
以及**done**属性 , 表示生成器是否已经产出了最后一个值 ( 产出最后的值之后 , 调用next返回的对象当中value都是undefined )
|
|
|
|
> Generator对象中的方法
|
|
> + Generator.prototype.next()
|
|
> 返回一个由yield表达式生成的值
|
|
> + Generator.prototype.return( [val] )
|
|
> 返回给定的值并结束生成器
|
|
> + Generator.prototype.throw( [msg] )
|
|
> 向生成器抛出一个错误
|
|
|
|
```javascript
|
|
function * num() {
|
|
var a = 0;
|
|
while(a < 3) {
|
|
yield a;
|
|
a++;
|
|
}
|
|
}
|
|
|
|
var gen = num();
|
|
console.log(gen.next().value); // 0
|
|
console.log(gen.next().value); // 1
|
|
console.log(gen.next().value); // 2
|
|
console.log(gen.next().value); //undefined
|
|
```
|
|
|
|
---
|
|
#### yield *
|
|
可以将生成器中需要生成的值委派至另一个生成器
|
|
```javascript
|
|
function* anotherGenerator(i) {
|
|
yield i + 1;
|
|
yield i + 2;
|
|
yield i + 3;
|
|
}
|
|
|
|
function* generator(i){
|
|
yield i;
|
|
yield* anotherGenerator(i);
|
|
yield i + 10;
|
|
}
|
|
|
|
var gen = generator(10);
|
|
|
|
console.log(gen.next().value); // 10
|
|
console.log(gen.next().value); // 11
|
|
console.log(gen.next().value); // 12
|
|
console.log(gen.next().value); // 13
|
|
console.log(gen.next().value); // 20
|
|
```
|
|
|
|
> 生成器函数在浏览器当中的兼容性不佳 , 更推荐在nodejs当中使用 , 而不是在页面脚本当中使用
|
|
> 
|
|
>  |