在复习过程中,记录一下关于javascript的相关知识:
基本语法啥的就不再多说了,此片记录一下我对js中垃圾回收机制的理解
什么是垃圾回收机制
垃圾回收机制(GC:Garbage Collection):执行环境负责管理代码执行过程中使用的内存。JS的垃圾回收机制是为了以防内存泄漏,内存泄漏的含义就是当已经不需要某块内存时这块内存还存在着,没有被释放,导致该内存无法被使用,垃圾回收机制就是间歇的不定期的寻找到不再使用的变量,并释放掉它们所指向的内存
什么样的东西会被认为是垃圾?
这里简要概括一下内存的生命周期:
首先,当我们声明变量&函数&对象时,系统会在内存中开辟空间;
然后读写内存,也就是将我们声明的这些东西放入内存中
最后是内存回收,当这些变量使用完毕后,由垃圾回收器自动回收不再使用的内存
那么如何判定是否使用完毕呢,对于全局变量,除了页面关闭这种情况,一般不会去回收全局变量;
对于局部变量,一旦不再被引用,就会被回收;
如果不存在垃圾回收机制?
如果不存在垃圾回收机制,那么没有被引用的变量就会一直存在,但我们的内存是有限的,这些没有用的数据为什么不清理掉呢?
上面👆是我个人的理解;下面会给出更优质的解答:
字符串、对象和数组没有固定的大小,所以只有当它们大小已知时才能对它们进行动态的存储分配。JavaScript程序每次创建字符串、数组或对象时,解释器都要分配内存才存储这个实体。只要像这样动态地分配了内存,最终都要释放这些内存以便它们能够被再次利用;否则,JavaScript的解释器将会消耗完系统中所有可用的内存,造成系统崩溃。
内存泄露?
我在写此片文章时,查阅了很多资料,无一例外的都看到了这个词,那么他是什么意思呢?
具体来说就是分配的内存由于某种原因未释放或无法进行释放,这个就是内存泄漏
可以这样理解,分配的内存无法释放,就相当于内存变相的变小了,那么就是内存泄漏出去了...
闭包?
说到内存泄漏,那么我就想起了闭包,简单用我自己的理解去概括一下闭包:
通常是通过作用域访问原则,在子级作用域中,访问到了父级作用域当中的变量/对象,这样就叫做闭包;
常见的就是函数中嵌套函数👇
function f1() {
var a = 0
function f2() {
console.log(a);
}
return f2
}
let res = f1()
res()
可以看到f2读取到了f1中声明的a并输出了
这个就是典型的闭包
闭包&垃圾回收
闭包的优点是可以将变量保护起来,还是双重保护,函数套函数,防止全局变量被污染
缺点是里层函数一直引用外层函数的值,导致垃圾回收机制无法判定外层函数的这个被引用的变量是一个垃圾,如果他们是互相引用,且只有他们两个互相引用,那么垃圾回收机制可以判定他们两个都是垃圾并加以回收,但是外层函数根据作用域访问原则并不能访问里层函数中被保护的变量,所以导致了单项引用且无法回收导致了内存泄漏的问题