JavaScript 中的变量如何分配内存?

在 JavaScript 中,变量是用来存储数据值或引用对象的标识符。在声明变量时,JavaScript 引擎会自动为其分配内存,并根据变量类型和作用域等因素决定如何管理这些内存。

内存分配

在 JavaScript 中,有两种类型的内存分配:基础类型和引用类型。

基础类型的内存分配

JavaScript 中的基础类型包括数字、字符串、布尔值、null 和 undefined 等。这些基础类型的值通常存储在栈中,因为它们的大小固定,并且可以直接访问。

例如,当我们声明一个数字变量时,JavaScript 引擎会在栈中分配一个新的内存空间,并将该变量的值存储在该空间中:

--- --- - ---

在这个例子中,变量 num 存储在栈中,并被赋值为数字 42。由于数字是基本类型,num 变量的值直接存储在栈中。

引用类型的内存分配

JavaScript 中的引用类型包括对象、数组、函数等,它们的大小不固定并且可以动态增长。这些引用类型的值通常存储在堆中,因为它们的大小不确定,并且需要通过引用间接访问。

例如,当我们声明一个对象变量时,JavaScript 引擎会在堆中分配一个新的内存空间,并将该变量的引用存储在栈中:

--- --- - - ----- -------- ---- -- --

在这个例子中,变量 obj 存储在栈中,但对象 { name: 'Alice', age: 30 } 实际上存储在堆中,并通过 obj 变量的引用进行访问。当我们修改对象 obj 的属性时,实际上是在修改其指向的堆中的值:

------- - ---

内存管理

在 JavaScript 中,内存管理由垃圾回收器(garbage collector)负责。垃圾回收器会定期检查堆中的对象,并清除不再使用的对象所占用的内存空间,以便将它们释放给操作系统。

由于 JavaScript 是一种动态类型语言,变量的类型和生命周期等信息只能在运行时确定。因此,垃圾回收器需要跟踪每个变量的引用情况,以便判断哪些对象可以被清除。当一个对象不再有任何引用时,该对象就可以被认为是垃圾,并从内存中删除。

内存泄漏

尽管 JavaScript 的垃圾回收器可以自动管理内存,但仍然有可能发生内存泄漏(memory leak)的情况。内存泄漏通常是由于代码中存在未释放的引用所导致的。例如,在下面的代码中:

-------- ----------- -
  --- --- - - ----- ------ ---- -- --
  ------ ----
-

--- ---- - ------------
--- ---- - ------------

每次调用 createObj() 函数时,都会创建一个新的对象。由于没有对这些对象进行垃圾回收,它们将一直留存在堆中,直到页面关闭或浏览器崩溃。这种情况就被称为内存泄漏。

为避免内存泄漏,我们应该尽量避免创建过多的临时变量,并在不需要使用变量时尽快将其设置

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/27369