JavaScript 内存管理于我们来说是自动的、不可见的。我们创建的原始类型、对象、函数等等,都会占用内存。
当这些数据不被需要后会发生什么?JavaScript 引擎如何发现并清除他们?
可触及(Reachability)
JavaScript 内存管理的关键概念是可触及(Reachability)。
简单来说,“可触及”的值就是可访问的,可用的,他们被安全储存在内存。
-
以下是一些必定“可触及”的值,不管出于任何原因,都不能删除:
- 当前函数的局部变量和参数。
- 当前调用链(current chain of nested calls)中所有函数的局部变量和参数。
- 全局变量。
- (以及其他内部变量)
这些值都称为 root。
-
其他值是否可触及视乎它是否被 root 及其引用链引用。
假设有一个对象存在于局部变量,它的值引用了另一个对象,如果这个对象是可触及的,则它引用的对象也是可触及的,后面会有详细例子。
JavaScript 引擎有一个垃圾回收后台进程,监控着所有对象,当对象不可触及时会将其删除。
一个简单例子
// user 引用了一个对象
let user = {
name: 'John',
}
箭头代表的是对象引用。全局变量 "user"
引用了对象 {name: "John"}
(简称此对象为 John)。John 的 "name"
属性储存的是一个原始值,所以无其他引用。
如果覆盖 user
,对 John 的引用就丢失了:
user = null
本文为原创,未经授权,禁止任何媒体或个人自媒体转载
商业侵权必究,如需授权请联系340443366@qq.com
最新评论