闭包
闭包是指一个函数可以访问另一个函数中的变量。
常见的形式:函数里嵌套函数。
缺点:大量使用闭包会造成内存泄漏。(内存泄漏:指有大量变量不能得到及时释放)
//点击自增案例
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时,则说明没有办法再访问这个值了,因而就可以将其占用的内存空间回收回来。这样,当垃圾收集器下次再运行时,它就会释放那 些引用次数为零的值所占用的内存。
网友评论