--- title: 生成器函数 date: 2018-4-29 19:57:44 tags: - JavaScript - ECMAScript6 categories: - JavaScript --- `function *`声明可以用于定义一个生成器函数 , 它返回一个Generator对象 语法
function * name([param[,param[,...param]]])
{ statement }
生成器是一种可以从中退出后重新进入的函数 函数内部的局部变量会在每次执行后被保存 , 下次进入可以继续使用 调用生成器函数并不会执行它的主体 , 而是返回对应的一个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当中使用 , 而不是在页面脚本当中使用 > ![generate function](/images/JavaScript/generate_function1.png) > ![generate function](/images/JavaScript/generate_function2.png)