在非严格模式下,Generator函数中yield不改变this值,this由首次调用方式决定且全程静态不变;yield仅暂停执行,不触发绑定或兜底行为。

在非严格模式下,Generator 函数内部 yield 执行时,并不涉及 this 的重新绑定或动态变化——它根本不会改变函数内 this 的值,也不会触发任何“兜底”行为。
yield 本身不干预 this 绑定
yield 是一个暂停执行、返回值并保存上下文的控制流语句,不是作用域或执行上下文切换指令。它不创建新执行环境,也不调用 bind、call 或 apply,因此对 this 完全无影响。
- Generator 函数被调用时,其内部 this 值由调用方式决定(如普通调用、方法调用、构造调用等),与是否含 yield 无关
- 非严格模式下,普通函数调用时 this 默认指向全局对象(浏览器中为
window,Node.js 中为globalThis) - 这个默认行为发生在函数**开始执行时**,而非每次 yield 时
Generator 函数的 this 是静态的
整个生成器对象(generator object)在首次调用时就确定了其闭包内的 this 值,后续所有 next() 调用都复用该上下文:
- 即使多次调用
next(),函数体恢复执行的位置不同,this 始终是初始调用那一刻绑定的值 - 不存在“每次 yield 后重新计算 this”的机制;yield 不是函数入口,只是执行断点
- 例如:
function* g() { console.log(this); yield 1; console.log(this); },两次console.log输出的 this 完全相同
所谓“兜底”只发生在函数入口,不是 yield 时刻
非严格模式下 this 的“兜底”(即默认为全局对象)仅适用于直接调用函数时未显式指定 this的情形:
-
g()→ this 为window(非严格) -
obj.g()→ this 为obj -
g.call(null)→ 非严格模式下仍兜底为全局对象 - 这个绑定发生在
g()返回 generator 对象那一瞬,yield 语句从不参与该过程
注意:箭头函数和嵌套函数另有规则
如果 Generator 函数内部定义了箭头函数,或通过普通函数嵌套访问 this,那遵循的是常规词法/动态绑定规则,但这些行为与 yield 无关:
- 箭头函数继承外层函数的 this,而外层就是 Generator 函数本身的 this
- 嵌套的普通函数若被直接调用(无上下文),其内部 this 在非严格模式下也会兜底为全局对象——但这属于该嵌套函数自身的调用逻辑,非 yield 引发

















