为什么未分配的 Vue 实例没有被垃圾收集?

Why doesn't an unassigned Vue instance get garbage collected?

这是在 HTML 页面上使用 VueJS 的标准方法(没有捆绑包)。没有任务。

<script>
new Vue({
  el: '#root',
  data: {
    title: 'Hello'
  }
});
</script>

为什么垃圾收集器不收集这个 Vue 对象?

当你实例化一个 Vue 对象时,它实际上将自己安装到 DOM 元素,这里是 #root 元素,正如本文档页面 The Vue Instance > Instance Lifecycle Hooks.[=16= 中简要暗示的那样]

通过在浏览器中使用开发人员工具,就像在 Chrome 中一样,您可以打开控制台选项卡和提示符,键入 console.log(window.$vm0); 并按回车键。即使没有分配给变量,您也可以访问 Vue 运行时实例:

> Vue {_uid: 2, _isVue: true, $options: {…}, _renderProxy: Proxy, _self: Vue, …}

我在 how to properly access the Vue instance if it wasn't assigned to a variable during instantiation 上打开了另一个问题。

作为对当前问题的回答,要点是 Vue 本身实际上在幕后发生了变量赋值/DOM 挂载,这就是垃圾收集的原因没有触发。

PS。有一篇关于在 Vue 应用程序中处理垃圾收集的详细文档文章 Avoiding Memory Leaks

Vue 应用程序由一个 Vue 实例组成,该实例使用新 Vue 创建并安装在 ID 为“#root”的 DOM 元素中。 Vue 是 运行 幕后的所有魔法,这就是垃圾收集器不会收集 Vue 对象的原因。

除了数据属性之外,Vue 实例还公开了许多实例属性和方法。这些以 $ 为前缀,以区别于用户定义的属性。例如:

var data = { title: 'Hello' }
var vm = new Vue({ 
    el: '#root',
    data: data
});
// If you check below code
vm.$data === data // => true
vm.$el === document.getElementById('root') // => true