变量,作用域和内存问题
基本类型和引用类型的值
基本类型
Undefined
Null
Boolean
Number
String
引用类型
动态的属性
类型检查
variable instanceof constructor
typeof varaible
- ECMA-262规定在内部实现
[[Call]]方法的对象都应该在应用typeof操作符时返回function
执行环境和作用域
- 全局执行环境是一个最外围的执行环境
- 每个函数都有自己的执行环境
- 当执行流入一个函数时,函数的环境就会被推入一个环境栈中
- 函数执行之后栈将环境弹出
- 将控制权返回给之前的执行环境
- 作用域链
- 是保证对执行环境有权访问的所有变量和函数的有序访问
- 如果环境是函数,则将其活动对象作为变量对象
- 活动对象在最开始时只包含一个变量,
arguments
- 作用域链中的下一个变量对象来自包含(外部)环境
- 在下一个变量对象则来自下一个包含环境
- 这样子一直延续到全局执行环境
- 全局执行环境始终是作用域链中的最后一个对象
延长作用域链
- 可以在作用域链的前端临时增加一个变量对象
try-catch语句的catch块
with 语句
function buildUrl () {
var qs = '?debug=true';
with (location) {
var url = href + qs;
}
return url;
}
没有块级作用域
声明变量
- 使用
var 关键字声明的变量会自动被添加到最接近的环境中
- 不适用
var 进行声明.灰指甲加入到全局环境中
垃圾收集
- 原理
- 执行
- 会按照固定的时间间隔(或代码执行中预订的收集事件),周期性地执行这一操作
标记清除
- 当变量进入环境时,标记为"进入环境"
- 当变量离开环境时,标记为"离开环境"
- 通过翻转某个特殊的位来记录一个变量何时进入环境
- 或者使用一个"进入环境的"变量列表及一个"离开环境的"变量列表来跟踪那个变量发生了变化
- 垃圾收集器会给储存在内存中的所有变量都加上标记
- 去掉环境中的变量以及被环境中的变量引用的变量的标记
技术引用
- 含义
- 跟踪记录每个值被引用的次数
- 声明一个变量并将一个引用类型值赋给该变量时,引用次数是1
- 同一个只又被付给另外一个变量,则改制的引用次数加1
- 相反则减1
- 变成0的时候回收内存
- 问题
管理内存
- 手动触发垃圾收集过程
window.CollectGarbage()
window.opera.collect()
- 解除引用
- 一旦数据不在有用,最好将其只设置为 null 来释放其引用
- 局部变量会在他们离开执行环境是自动被解除引用
- 解除引用真正的作用是让值脱离执行环境,以便垃圾收集器在下次运行时将其回收