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

2019-03-04  本文已影响0人  Gino_Li

闭包

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

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

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

            //点击自增案例
            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时,则说明没有办法再访问这个值了,因而就可以将其占用的内存空间回收回来。这样,当垃圾收集器下次再运行时,它就会释放那 些引用次数为零的值所占用的内存。

上一篇下一篇

猜你喜欢

热点阅读