SOURCE

// // 1.构造函数方式声明
// const GeneratorFunction = Object.getPrototypeOf(function * () {}).constructor;

// var gen = new GeneratorFunction("a", "yield a * 2");
// var iterator = gen(5);
// console.log('iterator:', JSON.stringify(iterator.next()));
// console.log('iterator:', JSON.stringify(iterator.next()));

// // 2.函数表达式
// var gen2 = function * (a) {
//   yield a * 2;
// }
// var iterator2 = gen2(6);
// console.log('iterator2:', JSON.stringify(iterator2.next()));
// console.log('iterator2:', JSON.stringify(iterator2.next()));

// // 3.函数声明
// function *generator(a){
//   yield a * 2;
// }
// var gen3 = generator(7);
// console.log('gen3:', JSON.stringify(gen3.next()));
// console.log('gen3:', JSON.stringify(gen3.next()));

// // 4.对象的方法
// var obj = {
//   *generatorMethod(a) {
//   	yield a * 2;
// 	}
// }
// var gen4 = obj.generatorMethod(8);
// console.log('gen4:', JSON.stringify(gen4.next()));
// console.log('gen4:', JSON.stringify(gen4.next()));

// // 5.类的方法
// class Myclass{
//   *generatorMethod(a) {
//   	yield a * 2;
// 	}
// }
// var instance = new Myclass();
// var gen5 = instance.generatorMethod(9);
// console.log('gen5:', JSON.stringify(gen5.next()));
// console.log('gen5:', JSON.stringify(gen5.next()));

// 6.每次构建了一个迭代器,实际上就是隐式的创建了一个生成器的实例
function *foo(){
  var x = yield 2;
  z++;
  var y = yield(x * z);
  console.log(x, y, z);
}
var z = 1;

var it1 = foo();
var it2 = foo();

var val1 = it1.next().value; // 2
var val2 = it2.next().value; // 2

val1 = it1.next(val2 * 10).value; // x: 20, z: 2 --> 40
val2 = it2.next(val1 * 5).value; // x: 200, z: 3 --> 600
 
it1.next(val2 / 2); // y: 300
it2.next(val1 / 4); // y: 10
console 命令行工具 X clear

                    
>
console