JS 垃圾回收机制 闭包

215 阅读3分钟

什么是垃圾回收机制?

垃圾回收机制(Garbage Collection)简称GC机制;核心思想:如何判断内存是否已经不再被使用,如果是就视为垃圾释放掉;不再用到的内存,没有及时释放,就叫内存泄漏;垃圾回收常用算法:引用计算法和标记清除法。

内存的生命周期

image.png
JS环节中分配的内存,一般有如下生命周期:
1.内存分配:当我没声明变量、函数、对象的时候,系统会自动为他们分配内存。
2.内存使用:既读写内存,也就是使用变量、函数等。
3.内存回收:使用完毕,由垃圾回收自动回收不再使用的内存。
4.说明:1.全局变量一般不会回收(关闭页面回收);2.一般情况下局部变量的值,不用了,会被自动回收掉。
垃圾回收机制的核心思想就是:如何判断内存是否已经不再被使用,如果是就视为垃圾释放掉。

垃圾回收机制-引用计算法

什么是引用计算法?

IE采用的引用计算法,定义[内存不再使用]的标准很简单,就是看一个对象是否有指向它的引用。
算法:
1.跟踪记录每个值被引用的次数。
2.如果这个值的被引用了一次,那么就记录次数1
3.多次引用会累加。
4.如果减少一个引用就减1.
5.如果引用次数是0,则释放内存。

image.png

垃圾回收机制-标记清除法

引用计数法的问题?

image.png
引用计算法:会出现循环引用的问题,因为他们的引用次数永远不会是0。这样的互相引用如果说很大量的存在就会导致大量的内存泄漏。

什么是标记清除法

当变量进入执行环境时,就标记这个变量“进入环境”,被标记为“进入环境”的变量是不能被回收的,因为他们正在被使用。当变量离开环境时,就会被标记为“离开环境”,被标记为“离开环境”的变量会被内存释放。

标记清除算法分为两步:

第一步:标记。

第二步:清除。

image.png

闭包

以下写法就是闭包

image.png
1.函数嵌套,一个函数里面嵌套一个函数
2.里面的函数在访问外层函数定义的变量

什么是闭包

概念:一个函数对周围状态的引用捆绑在一起,内层函数中访问到其外层函数的作用域
简单理解:闭包 = 函数嵌套+里层函数访问外层函数的变量 断点调试查看闭包

image.png

闭包的作用

可以在函数外面访问函数内部定义的变量

基本用法

image.png

闭包-应用场景

闭包应用

实现数据的私有化。

比如,我们要做个统计函数调用次数,函数调用一次,就++

传统的做法

image.png 但是,这样count是个全局变量,很容易被修改 可以使用闭包来数据私有化

image.png 这样实现了数据私有,无法直接修改count