JavaScript 垃圾回收

2020-02-06

JavaScript 内存管理于我们来说是自动的、不可见的。我们创建的原始类型、对象、函数等等,都会占用内存。

当这些数据不被需要后会发生什么?JavaScript 引擎如何发现并清除他们?

可触及(Reachability)

JavaScript 内存管理的关键概念是可触及(Reachability)

简单来说,“可触及”的值就是可访问的,可用的,他们被安全储存在内存。

  1. 以下是一些必定“可触及”的值,不管出于任何原因,都不能删除:

    • 当前函数的局部变量和参数。
    • 当前调用链(current chain of nested calls)中所有函数的局部变量和参数。
    • 全局变量。
    • (以及其他内部变量)

    这些值都称为 root

  2. 其他值是否可触及视乎它是否被 root 及其引用链引用。

    假设有一个对象存在于局部变量,它的值引用了另一个对象,如果这个对象是可触及的,则它引用的对象也是可触及的,后面会有详细例子。

JavaScript 引擎有一个垃圾回收后台进程,监控着所有对象,当对象不可触及时会将其删除。

一个简单例子

// user 引用了一个对象
let user = {
  name: 'John',
}

箭头代表的是对象引用。全局变量 "user" 引用了对象 {name: "John"}(简称此对象为 John)。John 的 "name" 属性储存的是一个原始值,所以无其他引用。

如果覆盖 user,对 John 的引用就丢失了:

user = null

本文为原创,未经授权,禁止任何媒体或个人自媒体转载
商业侵权必究,如需授权请联系340443366@qq.com
标签: javascript

评论

Loading...

最新评论

相关推荐

前端登录凭证存储方案
现在是前后端分离时代,接口登录凭证通常使用cookie,session,web storage来实现,三种方法区别可以阅...
React17.0生命周期调整
在即将到来的react17.0版本,react团队对生命周期做了调整,将会移除 componentWillMount,c...
ES6装饰器的应用
什么是装饰器 装饰器(Decorator)函数,是用来修改类的行为,一个装饰器函数有三个参数 target 装饰...
scroll-top-icon