JavaScript Generator 行为困惑:next(true)为何输出0而非3?
为什么调用生成器的
next(true)返回0而非预期的3? 先还原你遇到的生成器代码(对应原示例逻辑):
function* takeANumber() { let num = 0; while (true) { let reset = yield num++; if (reset) { num = 0; } } } const gen = takeANumber(); console.log(gen.next().value); // 0 console.log(gen.next().value); // 1 console.log(gen.next().value); // 2 console.log(gen.next(true).value); // 0(你预期3) console.log(gen.next().value); // 1
核心原因在于ES6生成器中yield的执行逻辑和next()传参的作用:
yield num++是先返回当前num值,再执行num自增。- 调用
next(参数)时,这个参数会被赋值给上一次执行的yield表达式的返回值,而非直接控制当前要返回的value。
拆解每一步的执行流程:
- 第一次
gen.next():执行到yield num++,返回num=0,随后num自增为1。 - 第二次
gen.next():从上次yield的位置继续,reset被赋值为undefined(无传参),不触发重置,继续到下一个yield,返回num=1,num自增为2。 - 第三次
gen.next():继续执行,reset=undefined,到yield返回num=2,num自增为3。 - 第四次
gen.next(true):从上次yield的位置继续,reset被赋值为true,触发num=0的重置。随后进入下一轮循环,执行到yield num++,返回当前num=0,再自增为1。 - 第五次
gen.next():返回num=1,自增为2。
这就是为什么第四次调用返回0而非3——next(true)的参数触发了num的重置,而此时要返回的是重置后的num值。
内容的提问来源于stack exchange,提问作者Sinister
相关产品推荐
相关产品推荐

