You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript生成器next()调用时代码执行顺序及结果疑问

Generator函数next()调用的执行顺序详解

先看你提供的代码:

function* bankAccount() {
  let balance = 0;
  while (balance >= 0) {
    balance += yield balance;
  }
  return 'bankrupt! ';
}

let userAccount = bankAccount();

console.log(userAccount.next());
console.log(userAccount.next(10));
console.log(userAccount.next(-15));

三次next()调用的具体执行流程

第一次调用 userAccount.next()

  1. 调用bankAccount()生成迭代器,函数体并未立即执行,直到第一次next()触发执行。
  2. 进入函数,初始化balance = 0。
  3. 进入while循环,判断balance >= 0(0 >= 0,条件成立)。
  4. 执行到yield balance,函数在此处暂停,返回{ value: 0, done: false }。注意:此时balance += yield balance中的+=逻辑还未执行。

第二次调用 userAccount.next(10)

  1. next(10)中的参数10会被当作上一个yield表达式的返回值,也就是yield balance这行代码的执行结果是10。
  2. 继续执行上次暂停的代码:balance += 10 → balance变为0 + 10 = 10。
  3. 回到while循环的条件判断:10 >= 0(条件成立)。
  4. 再次执行到yield balance,函数暂停,返回{ value: 10, done: false }。此时依然停在yield处,balance += ...未执行。

第三次调用 userAccount.next(-15)

  1. 参数-15作为上一个yield表达式的返回值,即yield balance的执行结果是-15。
  2. 继续执行上次暂停的代码:balance += -15 → 10 + (-15) = -5。
  3. 回到while循环的条件判断:-5 >= 0(条件不成立),直接退出循环。
  4. 执行函数最后的return 'bankrupt!',返回{ value: 'bankrupt!', done: true }。

为什么和你的预期不符?

你以为第三次调用会先检查balance为10,再执行balance += -15后yield-5,但实际上:
第二次调用next(10)返回后,函数已经停在yield balance这一步,第三次调用next(-15)时,会先完成上一次暂停时未执行的balance += 参数操作,之后才会去判断while循环的条件——这时候balance已经是-5,直接退出循环返回破产信息,不会再执行yield。

内容的提问来源于stack exchange,提问作者Billies Wesley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 14:35:21