Vue3的packages\reactivity\src\effect.ts中的trackEffect方法:
export function trackEffect(
effect: ReactiveEffect,
dep: Dep,
debuggerEventExtraInfo?: DebuggerEventExtraInfo,
) {
if (dep.get(effect) !== effect._trackId) {
dep.set(effect, effect._trackId)
const oldDep = effect.deps[effect._depsLength] // 这里貌似永远都是 undefined
if (oldDep !== dep) { // 那么这里永远为 true,除非 dep 是 undefined(可能吗?)
if (oldDep) {
// 那么,感觉永远执行不到这里
cleanupDepEffect(oldDep, effect)
}
// 这里相当于 effect.deps[effect._depsLength] = dep 后 effect._depsLength++
// effect._depsLength++ 后,它指向了数组尾部空位置
// 例如:起初effect._depsLength === 0,执行 effect.deps[0] = dep1 后,effect.deps === [dep1]
// effect._depsLength++ 后为 1,则 effect.deps[0] === dep1,effect.deps[1] === undefined
// 回过头看看 const oldDep = effect.deps[effect._depsLength]
effect.deps[effect._depsLength++] = dep
} else {
// 那么,感觉也永远执行不到这里
effect._depsLength++
}
if (__DEV__) {
effect.onTrack?.(extend({ effect }, debuggerEventExtraInfo!))
}
}
}
请问什么情况下 oldDep 不为 undefined?
