垃圾回收
大部分现代的编程语言都是有自己的垃圾回收机制:垃圾回收的英文是
Garbage Collection,简称GC;对于那些不再使用的对象,都称之为是垃圾,它需要被回收,以释放更多的内存空间
-
常见的GC算法 – 引用计数
- 当一个对象有一个引用指向它时,那么这个对象的引用就+1
- 当一个对象的引用为0时,这个对象就可以被销毁掉
这个算法有一个很大的弊端就是会产生循环引用
-
常见的GC算法 – 标记清除
- 设置一个根对象,垃圾回收器会定期从这个根开始,查找所有从根开始有引用到的对象
- 对于那些没有引用到的对象,就认为是不可用的对象,就清除
这个算法可以很好的解决循环引用的问题
闭包
一个普通的函数,如果可以访问外层作用域的自由变量,那么这个函数和周围环境就是一个闭包
从广义的角度来说:js中的函数都是闭包
从狭义的角度来说:js中一个函数,如果访问了外层作用域的变量,那么它是一个闭包
function createAdd(count) {
function adder(num) {
return count + num
}
return adder
}
var adder4 = createAdd(4)
console.log(adder4(200)); // 204
var adder6 = createAdd(8)
console.log(adder6(8)); //16
闭包使得原本该销毁的作用域由于内部函数的引用没有销毁 始终存在在堆内存中 因此产生了内存泄露
- 解决
- 将保存着上层作用域引用的函数在使用完之后置为null将它的引用销毁在GC的下一次检查中对应的内存就会被销毁