问答

读了vue的destory源码感觉有内存泄漏的问题,有没有人指教一下?

作者:admin 2021-06-08 我要评论

用v-if来控制子组件显示,子组件调用了 $destroy 方法,看了下里面的代码,有解除父子关系,去掉watch监听,加标志声明已经摧毁了等处理,但是这个组件对象其实...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

用v-if来控制子组件显示,子组件调用了$destroy方法,看了下里面的代码,有解除父子关系,去掉watch监听,加标志声明已经摧毁了等处理,但是这个组件对象其实还是存在的,我在用setTimeout赋值给一个被销毁的组件的时候,发现也没有报错能打印出来(这和react不一样),我就存有疑问了,难道v-if不会销毁之前的组件而是重新创建新的组件吗,我又写了个例子验证了一下,发觉多次v-if后,内存明显变高没有降下来,这样来说其实用v-if销毁的组件其实还是存在内存种,难道vue其实有内存泄漏的风险吗?

###

我发现问题了,旧的子组件对象确实没有被其他地方引用所以他是可以被gc回收的,它不能被回收的原因是我在mounted里console.log了这个子组件对象,我注释了就可以被回收了,搞了半天console.log这个方法会把保存打印对象的引用所以不能被回收啊,所以生产环境不能用这个。
网上也有人这么说的:https://segmentfault.com/a/11...

###

JS没有内存管理接口,无法主动释放内存.
所以类的销毁只能做到去除副作用,做不到销毁实例--->这一步是交给调用者自己处理的,通过将引用置空的方式,然后等待引擎GC,回收内存.

class Test{
    destroy() {
    }
}

var test = new Test()
// do some thing
test.destroy()
// 置空引用,
test = null

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 读了vue的destory源码感觉有内存泄漏的

    读了vue的destory源码感觉有内存泄漏的

  • Flutter 在JMLink监听事件里跳转页面不

    Flutter 在JMLink监听事件里跳转页面不

  • 求教!在linux上的nginx服务器部署vue

    求教!在linux上的nginx服务器部署vue

  • PhpStorm魔术方法的警告怎么去除

    PhpStorm魔术方法的警告怎么去除

腾讯云代理商
海外云服务器