第 4 章 变量、作用域和内存问题
4.1 基本类型和引用类型的值
1、动态的属性
- 只能给引用类型动态的添加属性
2、复制变量值
基本类型值
- 不会相互影响
引用类型值
- 指针指向同一个堆内存空间
3、传递参数
基本类型
- 按值传递,不相互影响
引用类型
- 按值传递,函数内部变量的变化会反映在函数的外部
4、检测类型
基本数据类型
- 使用 typeof - 检测引用类型,会返回 object, 但却不知道是什么类型的对象 - 检测函数, 会返回 function - 检测正则,IE 和 Firefox 返回 object,根据规范不同 有些会返回 function
引用类型
- 使用 instanceof - 检测基本数据类型,始终返回 false, 因为基本类型不是对象
4.2 执行环境及作用域
1、执行环境
执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为。
每次进入一个新执行环境,都会创建一个搜索变量和函数的作用域链
类型
- 全局执行环境(全局环境) - 全局执行环境直到应用程序退 出——例如关闭网页或浏览器——时才会被销毁 - 不能直接访问局部环境中的任何数据 - 局部(函数执行环境) - 有权访问函数作用域中的变量 - 有权访问父环境、全局环境变量 - 有助于确认何时释放内存
2、延长作用域链
- 有些语句可以在作用域链的前端临时增加一个变量对象,该变量对象会在代码执行后被移除
- try-catch 语句的 catch 块
- with 语句
3、没有块级作用域
声明变量
- 使用 var 声明 - 自动被添加到最接近到环境中 - 不使用 var 声明 - 自动被添加到全局环境 - 注意 - 初始化变量前,一定要先声明
查询标识符
- 搜索过程从作用域链的前端开始,如果在局部环境中找到链该标识符,搜索过程停止,变量就绪,如果局部环境没有找到该变量,就沿作用域一直追溯到全局环境到变量对象
4.3 垃圾收集
1、标记清除
进入环境
- 当变量进入环境时,将这个变量标记为‘进入环境’
离开环境
- 当变量离开环境时,则将其 标记为“离开环境”
2、引用计数
引用计数的含义是跟踪记录每 个值被引用的次数
应用场景
- COM 对象的垃圾 收集机制
注意
- 可能会导致循环引用,永远不会被回收
3、性能问题
- 变量过多,垃圾收集器频繁运行,导致严重的性能问题
4、管理内存
- 设置 null 解除引用,让值脱离执行环境,以便垃圾收集器下次运行时将其回收
4.4 小结
1、基本类型和引用类型
2、执行环境和作用域
3、垃圾收集
标记清除
引用计数
- 不推荐,会导致循环引用的问题
及时解除全局对象、全局对象属性、循环引用变量的引用
类型
基本数据类型
- string 字符串
- number 数值
- boolean 布尔值
- undefined
- null
引用类型
- Array 数组
- Object 对象
- RegExp 正则