对 vue3 的响应式实现感到困惑

Confused about vue3's reactive implementation

在vue3的reactive implementation中,有一个effectStack。 我不明白为什么它必须是一个堆栈,如果效果会在 push() 之后立即 pop()? effectStack的长度是否可以大于1?

try {
  enableTracking()
  effectStack.push(effect)
  activeEffect = effect
  return fn()
} finally {
  effectStack.pop()
  resetTracking()
  activeEffect = effectStack[effectStack.length - 1]
}

我相信这是因为效果可以触发其他效果。

例如,一个computed 属性可能会呼唤另一个computed 属性,在这种情况下,两个效果将同时是运行时间。在那种情况下,'inner' 效果在 'outer' 效果完成之前运行,并且需要针对正确的效果注册依赖项。 'outer' 效果暂时隐藏,而 'inner' 效果是 运行,然后在完成时恢复。

因此,如果对 fn 的调用导致递归回到同一段代码,则长度可以大于 1。