3.内存管理
前置知识
绝大多数的程序语言,他们的内存生命周期基本一致:
- 分配所需使用的内存 ——(分配内存)
- 使用分配到的内存(读、写) ——(使用内存)
- 不需要时将其释放归还 ——(释放内存)
对于所有的编程语言,第二部分都是明确的。而第一和第三部分在底层语言中是明确的。
但在像JavaScript这些高级语言中,大部分都是隐含的,因为JavaScript具有自动垃圾回收机制(Garbage collected)。
因此在做JavaScript开发时,不需要关心内存的使用问题,所需内存分配和无用内存回收,都完全实现自动管理。
1.概述
像C语言这样的高级语言一般都有底层的内存管理接口,比如 malloc()和free()。另一方面,JavaScript创建变量(对象,字符串等)时分配内存,并且在不再使用它们时“自动”释放。 后一个过程称为垃圾回收。这个“自动”是混乱的根源,并让JavaScript(和其他高级语言)开发者感觉他们可以不关心内存管理。 这是错误的。 ——《MDN JavaScript 内存管理》
MDN中的介绍告诉我们,作为JavaScript开发者,还是需要去了解内存管理,虽然JavaScript已经给我们做好自动管理。
2.JavaScript内存生命周期
2.1 分配内存
在做JavaScript开发时,我们定义变量的时候,JavaScript便为我们完成了内存分配:
var num = 100; // 为数值变量分配内存var str = 'pingan'; // 为字符串变量分配内存var obj = { name : 'pingan'}; // 为对象变量及其包含的值分配内存var arr = [1, null, 'hi']; // 为数组变量及其包含的值分配内存function fun(num){ return num + 2;}; // 为函数(可调用的对象)分配内存// 函数表达式也能分配一个对象someElement.addEventListener('click', function(){ someElement.style.backgroundColor = 'blue';}, false);
另外,通过调用函数,也会分配内存:
// 类型1. 分配对象内存var date = new Date(); // 分配一个Date对象var elem = document.createElement('div'); // 分配一个DOM元素// 类型2. 分配新变量或者新对象var str1 = "pingan";var str2 = str1.substr(0, 3); // str2 是一个新的字符串var arr1 = ["hi