JavaScript 环境中分配的内存一般有如下生命周期:
🌰 代码示例:
// 在内存中给数值变量分配空间var a = 20;// 使用内存console.log(a + 80);// 使用完毕之后,释放内存空间a = null;
为了不让开发者费心分配内存,JavaScript 在定义变量时就完成了内存分配。
// 给数值变量分配内存var a = 123;// 给字符串分配内存var b = 'Hello';// 给对象及其包含的值分配内存var c = {a: 1,b: null,};// 给数组及其包含的值分配内存var d = [0, null, undefined, 'Hello'];// 给函数分配内存function e() {return 1;}// 函数表达式也能分配内存someElement.addEventListener('click',function () {someElement.style.backgroundColor = 'blue';},false);
函数调用结果分配对象内存。
// 分配 Date 对象实例var f = new Date();// 分配 DOM 元素var g = document.createElement('div');
分配新变量或新对象。
var s = 'bingo';var q = s.substr(0, 3);// q 是一个新的字符串// 因为字符串是不可变量// JavaScript 可能决定不分配内存// 只是存储 [0-3] 的范围var x = ['a', 'b'];var y = ['c', 'd'];var z = x.concat(y);// 新数组有四个元素 是 x 和 y 连接的结果
使用值的过程实际上是对分配内存进行读取与写入的操作。读取与写入可能是写入一个变量或者一个对象的属性值,甚至传递函数的参数。
大多数内存管理的问题都在这个阶段。在这里最艰难的任务是找到所分配的内存确实已经不再需要了。它往往要求开发者来确定在程序中哪一块内存不再需要并且释放它。
高级语言解释器嵌入了 垃圾回收器机制,它的主要工作是跟踪内存的分配和使用,以便当分配的内存不再使用时,自动释放它。这只能是一个近似的过程,因为要知道是否仍然需要某块内存是无法判定的(无法通过某种算法解决)。