从硬件层面看,计算机内存是由大量的 flip flops 所组成的(这里大概查了下,即大量的二进制电路所组成的,每个 flip flop 是一个电路拥有两种稳定状态,可用于保存状态信息)。每个 flip flop 包含少量晶体管并能够存储一个比特位。单个的 flip flops 可以通过一个唯一标识符寻址,所以就可以读和覆写它们。因此,理论上,我们可以把整个计算机内存看成是由一个巨大的比特位数组所组成的,这样就可以进行读和写。
内存中存储着很多东西:
js内存生命周期包括
编译器和操作系统一起协作来为你进行内存管理,当编译代码的时候,编译器会检查基本数据类型并提前计算出程序运行所需要的内存大小。在所谓的栈空间中,所需的内存大小会被分配给程序。这些变量所分配到的空间之所以被称为栈空间是因为当调用函数的时候,函数所需的内存会被添加到现存内存的顶部。当函数中断,它们被以 LIFO(后进先出) 的顺序移除。
有时我们不能在编译阶段判断所需内存大小,比如接受用户输入的数据.因此,就不能够在栈中为变量分配内存空间。相反,程序需要在运行时显式地从操作系统分配到正确的内存空间。这里的内存是由内存堆空间所分配的。
两者区别:
以v8引擎为例,V8引擎在chrome和node中负责解析和执行js,其简化来说包括两部分:Heap(用于分配内存),call stack(执行栈);
也就是说内存空间和执行栈是并列的

在计算机的数据结构中,栈比堆的运算速度快
1 | var a = 20; |
内存回收,泄漏见下篇内存机制