【发布时间】:2021-10-09 18:29:49
【问题描述】:
我有这个example stackblitz,我在其中为组件设置了一个“id”,您可以通过复选框创建和销毁该组件。每次创建组件的新实例时,都会给它一个递增的 id。
在每个组件中,都有一个 interval 控制台记录组件的 ID。我没有在销毁时取消订阅它。
正如预期的那样,组件被销毁后我继续看到日志。让我感到困惑的是,不知何故interval 仍然知道它来自哪个组件,并且在引用它的 id 时不会引发错误。如果组件被销毁,它的属性如何仍然可以访问?组件是否仍然存在,造成内存泄漏?
【问题讨论】:
-
是的!这是内存泄漏。这就是为什么你应该总是取消订阅。您可以将其视为一项全局服务,其中订阅实际上存储在 observable 上,这意味着它的生命周期不取决于设置订阅的组件。..
-
对,但在第 19 行尝试访问
this.id时不应该抛出引用错误吗?因为即使订阅仍然存在,组件也不应该存在,因为它已被销毁。this将不再是组件。所以我想知道“被破坏”的组件是否真的仍然存在,导致内存泄漏。 -
阅读“闭包”以更好地理解为什么会这样......
标签: angular rxjs angular-component-life-cycle