1、JS的回收机制

说明:vm.$refs 一个对象,持有已注册过 ref 的所有子组件(或HTML元素)

使用:在 HTML元素 中,添加ref属性,然后在JS中通过vm.$refs.属性来获取

注意:如果获取的是一个子组件,那么通过ref就能获取到子组件中的data和methods

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <!-- <script type="text/javascript" src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script> -->
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
    <style>

    </style>
</head>
<body>
    <div id="vue_app">
        <qinwm ref="vue_qinwm"></qinwm>
        <p ref="vue_p">Hello, world!</p>
        <button @click="getRef">getRef</button>
    </div>
</body>
</html>
<script>
    Vue.component("qinwm", {
        template: `<h1>{{msg}}</h1>`,
        data(){
            return {
                msg: "Hello, world!"
            };
        },
        methods:{
            func:function (){
                console.log("Func!");
            }
        }
    });
    new Vue({
        el: "#vue_app",
        data(){
            return {};
        },
        methods: {
            getRef () {
                console.log(this.$refs);
                console.log(this.$refs.vue_p); // <p>Hello, world!</p>
                console.log(this.$refs.vue_qinwm.msg); // Hello, world!
                console.log(this.$refs.vue_qinwm.func); // func:function (){ console.log("Func!"); }
                this.$refs.vue_qinwm.func(); // Func!

            }
        }
    });
</script>

一,从官网下载nodejs.org.

JavaScript垃圾回收的机制很简单:找出不再使用的变量,然后释放掉其占用的内存,但是这个过程不是实时的,因为其开销比较大,所以垃圾回收系统(GC)会按照固定的时间间隔,周期性的执行。

 

到底哪个变量是没有用的?所以垃圾收集器必须跟踪到底哪个变量没用,对于不再有用的变量打上标记,以备将来收回其内存。用于标记的无用变量的策略可能因实现而有所区别,通常情况下有两种实现方式:标记清除和引用计数。引用计数不太常用,标记清除较为常用。

 

 

二,按照步骤一步一步安装就好。

2、标记清除

js中最常用的垃圾回收方式就是标记清除。当变量进入环境时,例如,在函数中声明一个变量,就将这个变量标记为“进入环境”。从逻辑上讲,永远不能释放进入环境的变量所占用的内存,因为只要执行流进入相应的环境,就可能会用到它们。而当变量离开环境时,则将其标记为“离开环境”。

 

function test(){
  var a=10;//被标记,进入环境
  var b=20;//被标记,进入环境
}
test();//执行完毕之后a、b又被标记离开环境,被回收

3、引用此时

引用计数的含义是跟踪记录每个值被引用的次数。当声明了一个变量并将一个引用类型值(function
object
array)赋给该变量时,则这个值的引用次数就是1。如果同一个值又被赋给另一个变量,则该值的引用次数加1。相反,如果包含对这个值引用的变量又取得了另外一个值,则这个值的引用次数减1。当这个值的引用次数变成0时,则说明没有办法再访问这个值了,因而就可以将其占用的内存空间回收回来。这样,当垃圾回收器下次再运行时,它就会释放那些引用次数为0的值所占用的内存。

function test(){
  var a={};//a的引用次数为0
  var b=a;//a的引用次数加1,为1
  var c=a;//a的引用次数加1,为2
  var b={};//a的引用次数减1,为1
}

 

4、哪些操作会造成内存泄露

1)意外的全局变量引起的内存泄露

function leak(){
  leak="xxx";//leak成为一个全局变量,不会被回收
}

2)闭包引起的内存泄露

function bindEvent(){
  var obj=document.createElement("XXX");
  obj.onclick=function(){
    //Even if it's a empty function
  }
}

闭包可以维持函数内局部变量,使其得不到释放。
上例定义事件回调时,由于是函数内定义函数,并且内部函数–事件回调的引用外暴了,形成了闭包。

解决之道,将事件处理函数定义在外部,解除闭包,或者在定义事件处理函数的外部函数中,删除对dom的引用。

发表评论

电子邮件地址不会被公开。 必填项已用*标注