JavaScript高级程序设计学习笔记——基本介绍2

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;

你可能感兴趣的:(学习笔记)