有风就有翼

JavaScript 高级程序设计(第三版)读书笔记--第四章

变量,作用域和内存问题

基本类型和引用类型的值

基本类型

  • Undefined
  • Null
  • Boolean
  • Number
  • String

引用类型

  • 对象

动态的属性

  • 只能给引用类型动态添加属性

类型检查

  • variable instanceof constructor
  • typeof varaible
    • ECMA-262规定在内部实现[[Call]]方法的对象都应该在应用typeof操作符时返回function

执行环境和作用域

  • 全局执行环境是一个最外围的执行环境
    • Web 浏览器中,window 对象
  • 每个函数都有自己的执行环境
    • 当执行流入一个函数时,函数的环境就会被推入一个环境栈中
      • 函数执行之后栈将环境弹出
      • 将控制权返回给之前的执行环境
  • 作用域链
    • 是保证对执行环境有权访问的所有变量和函数的有序访问
    • 如果环境是函数,则将其活动对象作为变量对象
      • 活动对象在最开始时只包含一个变量,arguments
    • 作用域链中的下一个变量对象来自包含(外部)环境
    • 在下一个变量对象则来自下一个包含环境
    • 这样子一直延续到全局执行环境
    • 全局执行环境始终是作用域链中的最后一个对象

延长作用域链

  • 可以在作用域链的前端临时增加一个变量对象
  • try-catch语句的catch
  • with 语句
function buildUrl () {
    var qs = '?debug=true';

    with (location) {
        var url = href + qs;
    }
    return url;
}

没有块级作用域

声明变量

  • 使用 var 关键字声明的变量会自动被添加到最接近的环境中
  • 不适用var 进行声明.灰指甲加入到全局环境中
    • 在严格模式下,初始化未经声明的变量会导致错误

垃圾收集

  • 原理
    • 找出那些不再继续使用的变量,然后释放其占用的内存
  • 执行
    • 会按照固定的时间间隔(或代码执行中预订的收集事件),周期性地执行这一操作

标记清除

  • 当变量进入环境时,标记为"进入环境"
  • 当变量离开环境时,标记为"离开环境"
    • 通过翻转某个特殊的位来记录一个变量何时进入环境
    • 或者使用一个"进入环境的"变量列表及一个"离开环境的"变量列表来跟踪那个变量发生了变化
  1. 垃圾收集器会给储存在内存中的所有变量都加上标记
  2. 去掉环境中的变量以及被环境中的变量引用的变量的标记

技术引用

  • 含义
    • 跟踪记录每个值被引用的次数
    • 声明一个变量并将一个引用类型值赋给该变量时,引用次数是1
    • 同一个只又被付给另外一个变量,则改制的引用次数加1
    • 相反则减1
    • 变成0的时候回收内存
  • 问题
    • 循环应用(弊端)

管理内存

  • 手动触发垃圾收集过程
    • window.CollectGarbage()
    • window.opera.collect()
  • 解除引用
    • 一旦数据不在有用,最好将其只设置为 null 来释放其引用
    • 局部变量会在他们离开执行环境是自动被解除引用
  • 解除引用真正的作用是让值脱离执行环境,以便垃圾收集器在下次运行时将其回收

posted on 2019-02-13 14:30  有风就有翼  阅读(113)  评论(0)    收藏  举报

导航