闭包和内存泄漏的关系
什么是垃圾?
- 垃圾就是不再需要使用的变量
js的垃圾回收器是怎么回收的?
- 使用者无法触达的变量信息,他能确定你一定不想要,于是会回收; 什么是内存泄漏?
- 你已经不再需要使用的变量,但是依然能够触达,因此垃圾回收机制不会回收,这就是内存泄漏
垃圾回收器的实现方法:
- 引用计数
- 标记清除
闭包和内存泄漏的关系:
- 闭包很容易让人放松警惕,导致内存泄漏
- 闭包和其他的内存泄漏没有什么本质上的区别,都是持有了不再需要的函数引用,会导致函数关联的词法环境无法销毁,从而导致内存泄漏
- 闭包容易产生一个非常隐秘的泄漏点:当多个函数共享词法环境时,会导致词法环境膨胀,从而导致无法触及又无法回收的内存空间
js
//隐蔽的内存泄漏
function main(){
const doms = (1000个dom对象)
function f1(){}
function f2(){doms}
return f1
}
main()
//此时的doms完全无法触达,但是不会被回收,因为他和别的函数共享词法环境,当运行完f1以后,由于f2需要用到,所以不会回收。
调试:
浏览器的Memory里可以看内存占用和手动进行垃圾回收