美文网首页
JS中闭包以及垃圾回收机制

JS中闭包以及垃圾回收机制

作者: Gino_Li | 来源:发表于2019-03-04 20:14 被阅读0次

    闭包

    闭包是指一个函数可以访问另一个函数中的变量。

    常见的形式:函数里嵌套函数。

    缺点:大量使用闭包会造成内存泄漏。(内存泄漏:指有大量变量不能得到及时释放)

                //点击自增案例
                var span = document.querySelectorAll('.test span');
                var btns = document.querySelectorAll('.test button');
                function add(){
                    for(var i=0;i<btns.length;i++){
                        (function(k){
                            btns[k].addEventListener('click',function(){
                                var res = Number(span[k].innerText);
                                span[k].innerText=res+1;
                            })
                        })(i)
                    }
                }
                add();
    

    闭包里的变量k一直被点击事件里面的函数所引用,因此JS一直不能确定变量k什么时候不再需要引用,因此,所以k的内存一直不能释放,造成内存泄漏。

    这里涉及到JS垃圾回收机制的原理,下面简单介绍一下。

    垃圾回收机制

    常见的垃圾垃圾回收机制有2种:
    1.标记清除(现在的浏览器都是用这种方式)
    2.引用计数(了解)

    注意:开发过程中发现不再需要引用的对象把这个对象赋值为null。

    标记清除

    1.首先给所有的变量或者对象添加一个标记
    2.当变量进入环境(引用变量)的时候,把上一步标记的内容清除
    3.当变量离开环境(不再需要引用变量)的时候,再重新给这些变量添加标记
    4.这些重新添加上标记的变量或对象会回收到垃圾回收机器里面
    5.js会周期性的清除这些垃圾回收机器里面的所有对象或属性。

    引用计数

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

    相关文章

      网友评论

          本文标题:JS中闭包以及垃圾回收机制

          本文链接:https://www.haomeiwen.com/subject/gntwuqtx.html