Javascript js生成器函数中的first-next()是否始终执行,直到第一次生成?

Javascript js生成器函数中的first-next()是否始终执行,直到第一次生成?,javascript,generator,Javascript,Generator,建议“当调用迭代器的next()方法时,生成器函数体将执行,直到第一个屈服表达式”,我确实理解这个示例: 函数*logGenerator(){ 控制台日志(0); 控制台日志(1,收益率); 控制台日志(2,收益率); 控制台日志(3,收益率); } var gen=logGenerator(); 下一代();//0 下一代(“椒盐卷饼”);//1个椒盐卷饼 下一代(“加利福尼亚”);//2加利福尼亚州 下一代(“蛋黄酱”);//3蛋黄酱您可以通过记录生成器每次的产量,以及向产量表达式中添加值

建议“当调用迭代器的next()方法时,生成器函数体将执行,直到第一个屈服表达式”,我确实理解这个示例:

函数*logGenerator(){
控制台日志(0);
控制台日志(1,收益率);
控制台日志(2,收益率);
控制台日志(3,收益率);
}
var gen=logGenerator();
下一代();//0
下一代(“椒盐卷饼”);//1个椒盐卷饼
下一代(“加利福尼亚”);//2加利福尼亚州

下一代(“蛋黄酱”);//3蛋黄酱
您可以通过记录生成器每次的产量,以及向
产量
表达式中添加值来查看生成器的实际产量,从而更好地了解情况(MDN示例对此并不在意,因为它从不使用生成的值,它只是演示了
next()
参数的工作方式)

通常,您不会使用单个生成器生成值,也不会通过
next()
参数接收值,只使用其中一个。如果它生成值,您将使用
yield
本身作为语句(类似于
return
),通常不在表达式中。如果它接收到值,则使用
yield
,而表达式中没有参数。但正如我修改的示例所示,底层机制同时允许这两者。您只需跟踪混乱的执行顺序

函数*logGenerator(){
控制台日志(0);
控制台日志(1,收益率10);
控制台日志(2,产量20);
控制台日志(3,收益率30);
}
var gen=logGenerator();
console.log(“调用1”,gen.next().value);//0
log(“调用2”,gen.next('pretzel').value);//1 pretzel
console.log(“调用3”,gen.next('california').value);//2 california

console.log(“call 4屈服”,gen.next('maynaise').value);/3 maynaise
您似乎有点过早地停止阅读您引用的句子……即当迭代器的next()方法时,生成器函数体将一直执行到第一个yield表达式,该表达式指定要从迭代器返回的值,或者使用yield*委托给另一个生成器函数…由此,我们可以推断
yield
本身包含在
直到
中,否则,如果执行在收益率,那么收益率不能产生一个值谢谢你的回答。是的……我考虑过了,但是如果包含收益率,那么第一个例子中的第一个next()应该同时给出
0
1,“椒盐卷饼”
。因此,我认为我在这里遗漏了一些东西……你把控制台输出与生成的值是yieldah my bad混淆了。让我这样表示:如果包含第一个收益率,那么第一个next()应该已经迭代第一个收益率。第二个next()不应该
gen.next('pretzel')
give
2“pretzel”
取而代之的是?
console.log(1,yield)
在调用第二个next之前不会输出到控制台-因为
yield
是在console.log运行之前进行评估的-查看Thank you@Barmar的控制台输出以获得全面的答案。我把yield行为与执行(console.log)混淆了,您的示例很好地解释了这一点!我必须同意,它混淆了
yield
关键字执行双重任务的方式,既执行控制流,又作为隐式参数。