JavaScript作用域
没有块级作用域
if (true) {
var color = "blue";
}
alert(color); //"blue"
变量声明
使用var声明的变量会自动添加到最近的环境中
没有用var声明的变量会被添加到全局中
如果局部环境存在同名的标识符,就不会使用位于父环境的标识符
垃圾收集
标记清除
变量进入环境,标记为“进入环境”。离开环境,标记为“离开环境”
垃圾收集器工作原理:
1. 给所有内存中的变量加上标记
2. 去掉环境中的变量以及被环境中的变量所引用的变量标记
3. 再被加上标记的变量就是准备删除的变量
4. 销毁带标记的值,回收内存空间
对于第三点:什么是再被加上标记的变量?
变量进入环境,标记为“进入环境”。离开环境,标记为“离开环境”
引用计数
跟踪记录每个值(注意是值)被引用的次数
当值赋给变量时,这个值得引用次数加一
变量取了另外一个值,这个值得引用次数减一
值的引用次数变成0,释放内存
循环引用的问题
function problem(){
var objectA = new Object();
var objectB = new Object();
objectA.someOtherObject = objectB;
objectB.anotherObject = objectA;
}
当函数执行完毕后,objectA 和objectB 还
将继续存在,因为它们的引用次数永远不会是0。
解除引用
虽然JavaScript自带内存管理问题,但分配给浏览器的内存还是较少,
局部变量会在执行完后,自动清除,而全局变量却不会。
我们可以手动解除全局变量的引用,让值脱离执行环境,以便垃圾收集器下次运行时将其回收。
function createPerson(name){
var localPerson = new Object();
localPerson.name = name;
return localPerson;
}
var globalPerson = createPerson("Nicholas");
// 手工解除globalPerson 的引用
globalPerson = null;