blog-web/source/_posts/JavaScript/生成器函数.md
2018-05-20 20:36:45 +08:00

2.2 KiB

title date tags categories
生成器函数 2018-4-29 19:57:44
JavaScript
ECMAScript6
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] ) 向生成器抛出一个错误
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 *

可以将生成器中需要生成的值委派至另一个生成器

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 generate function