为什么生成器函数中while循环外的作用域代码不会重复执行?
生成器函数中变量声明不重复执行的原因
你的疑问核心在于生成器函数的执行机制——它不是普通函数那种调用一次就从头跑到尾,而是支持暂停和恢复执行,并且会全程保留函数的执行上下文。
具体过程拆解:
- 当你执行
const fibonacci = fibonacciGen();时,并没有立刻运行函数体里的代码,只是创建了一个生成器实例(迭代器对象),这个实例会负责保存函数的执行状态。 - 第一次调用
fibonacci.next()时,函数才开始执行:- 先完成
let a = 1; let b = 1;的变量声明和初始化 - 进入
while(true)循环,计算sum = a + b,更新a和b的值,遇到yield sum时暂停执行,并把当前的sum作为返回值输出
- 先完成
- 后续每次调用
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
相关产品推荐
相关产品推荐

