了解JavaScript中的生成器

时间:2015-04-02 20:30:45

标签: javascript generator yield ecmascript-6

有人可以帮我理解以下代码的作用吗?为什么"一个"没有打印到控制台?此外,g是生成器还是go生成器?



function *go() {
  var foo = yield;
  console.log(foo);
}

var g = go();
console.log(g.next('one')); 
console.log(g.next('two')); 




输出:

Object {value: undefined, done: false}
two
Object {value: undefined, done: true}

3 个答案:

答案 0 :(得分:3)

  

为什么"一个"没有打印到控制台?

因为第一次.next()调用(通常没有参数)只会将生成器从功能体代码的开头推进到第一个yield表达式(并返回在那里产生的值) )。 "传递的价值"在任何地方都无法访问。

然后,只有第二个.next(…)调用提供了yield表达式中的值,继续将生成器状态继续到下一个yield或函数的结尾。

  

此外,g是生成器还是go生成器?

g生成器(它也是迭代器)。 go是一个生成器函数,用于创建生成器(如构造函数创建实例)。

答案 1 :(得分:1)

只是为了加入讨论。这是一个展示我认为你想要实现的东西的演示。引用Mozilla docs

  

调用生成器函数不会立即执行其正文;而是返回函数的迭代器对象。当调用迭代器的next()方法时,执行生成器函数的主体直到第一个yield表达式,它指定从迭代器返回的值,或者使用yield *,委托给另一个生成器函数。 next()方法返回一个对象,其value属性包含yielding值和done属性,指示生成器是否已生成其最后一个值。

function* go(values) {
  while (values.length) {
    yield values.shift();
  }
}

var g = go(['one', 'two']);
document.getElementById("output").innerHTML += JSON.stringify(g.next());
document.getElementById("output").innerHTML += JSON.stringify(g.next());
// I'm done!
document.getElementById("output").innerHTML += JSON.stringify(g.next());
<pre id="output"></pre>

答案 2 :(得分:0)

第一行是yield的对象结果。该值未定义,因为您在yield关键字后面没有任何内容,但该函数未完成。

这两个是由函数中的日志函数打印的。

第三行是结束该值的函数的结果仍未定义(没有返回语句或值)并且该函数已完成。