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

为什么生成器函数中while循环外的作用域代码不会重复执行?

生成器函数中变量声明不重复执行的原因

你的疑问核心在于生成器函数的执行机制——它不是普通函数那种调用一次就从头跑到尾,而是支持暂停和恢复执行,并且会全程保留函数的执行上下文。

具体过程拆解:

  1. 当你执行const fibonacci = fibonacciGen();时,并没有立刻运行函数体里的代码,只是创建了一个生成器实例(迭代器对象),这个实例会负责保存函数的执行状态。
  2. 第一次调用fibonacci.next()时,函数才开始执行:
    • 先完成let a = 1; let b = 1;的变量声明和初始化
    • 进入while(true)循环,计算sum = a + b,更新a和b的值,遇到yield sum时暂停执行,并把当前的sum作为返回值输出
  3. 后续每次调用next(),函数都会从**上一次暂停的位置(也就是yield的下一行)**继续执行,而不是重新从函数开头跑。所以let a = 1和let b = 1这两行只会在第一次执行时运行一次,之后都是基于之前保存的a、b的值继续循环里的逻辑。

关键原因:

生成器函数的实例会完整保留整个函数的执行上下文,包括所有变量的当前值、执行到的代码位置,而不是只保留while循环的上下文。每次暂停时,这些状态都会被存在生成器实例里,恢复执行时直接复用,不会重新初始化变量。

举个直观的例子:

  • 第一次next()后,a=1,b=2
  • 第二次next()时,直接用这个状态计算sum=1+2=3,然后更新a=2,b=3,再暂停
  • 后续每一次调用都是在这个持续更新的状态上继续,完全不会回到函数开头重新声明变量

内容的提问来源于stack exchange,提问作者Diego Cândido

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 13:40:36