【疑惑】
function* foo(x){ var y=2*(yield(x+1)); var z=yield(y/3); return (x+y+z); } var a=foo(2); console.log(a.next()); console.log(a.next(3)); console.log(a.next(1)); console.log(a.next());
/*
{value: 3, done: false}
{value: 2, done: false}
{value: 9, done: true}
{value: undefined, done: true}
*/
生成器函数与其他函数不同的表现
1. 通过new运算符或函数调用的形式调用生成器函数,均会返回一个生成器实例;(感觉第一次像注册)
2. 通过new运算符或函数调用的形式调用生成器函数,均不会马上执行函数体的代码;
3. 必须调用生成器实例的next方法才会执行生成器函数体的代码。
如:
1 function *say(msg){ 2 console.log(msg) 3 } 4 var gen = say('hello world') // 没有显示hello world 5 console.log(Object.prototype.toString.call(gen)) // 显示[object Generator] 6 gen.next(); //显示helloword
关键字:yeild,迭代生成器
用于马上退出代码块并保留现场,当执行迭代器的next函数时,则能从退出点恢复现场并继续执行下去。
1. yield后面的表达式将作为迭代器next函数的返回值;
2. 迭代器next函数的入参将作为yield的返回值(有点像运算符)。