有人可以帮我理解以下代码的作用吗?为什么"一个"没有打印到控制台?此外,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}
答案 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关键字后面没有任何内容,但该函数未完成。
这两个是由函数中的日志函数打印的。
第三行是结束该值的函数的结果仍未定义(没有返回语句或值)并且该函数已完成。