这是我的示例代码:
function *g() {
while (true) {
console.log(yield)
}
}
var gen = g();
gen.next(3); // {value: undefined, done:false}
gen.next(3); // 3 {value: undefined, done:false}
gen.next(3); // 3 {value: undefined, done:false}
为什么传递给第一个 next()
函数的第一个参数不起作用?还有为什么value属性的值是undefined
,不应该是传入的参数值吗?
这是生成器中发生的事情。
第一次调用初始化生成器(并返回一个迭代器),不运行任何内部代码。
从那时起,迭代器上对 .next(value)
的每次调用都会传递要从当前暂停的 yield
返回的 value
并继续执行到下一个 yield
(或函数结束),返回 yield
编辑(或返回)的值。
现在,第一个 .next
调用中当前暂停的 yield
是多少?没有,我们从函数的顶部开始执行。
因此,第一个值是undefined
,无论您将什么传递给第一个next
调用(它只是被忽略)。
至于 yield
的值是 undefined
,您将得到您 yield
的值。
function *g() {
yield; // yields undefined
yield 3;
yield 'a';
}
for (const v of g()) {
console.log(v);
}