JS高程学习(四)--变量,作用域和内存问题

230 阅读4分钟

一. 变量

  1. 变量的本质: 用于在特定的时间保存特定值的一个名字
  2. 变量的数据类型:
    • 基本数据类型:简单的数据段
    • 引用类型:由多个值构成的对象
  3. 为基本类型的值添加属性,没有任何效果(不推荐这么做),不会报错
  4. 基本类型之间的复制,会创建一个新值,然后复制给新变量
  5. 引用类型之间的复制,复制之后的值与被复制的值都指向同一个对象,但是两个变量拥有不同的空间
  6. ECMAScript 中所有函数的参数都是按值传递的, 基本类型值的传递如同基本类型变量的复制一样,而引用类型的值传递,则如同引用类型变量的复制一样
  7. typeof操作符 是确定一个变量是字符串,数值,布尔值还是undefined的最佳工具
  8. 所有的引用类型的值都是Object的实例。因此,在检验一个引用类型值和Object构造函数时,instanceof 操作符始终都会返回true。当然,如果使用 instanceof 操作符检测基本类型的值,则始终都会返回false,因为基本类型不是对象

二. 作用域

  1. 执行环境 定义了变量或函数有权访问的其他数据。每个执行环境都有一个与之关联的变量对象
  2. 执行环境类型: 全局,局部(函数)
  3. 全局执行环境被认为是 window对象,因此所有全局变量和函数都是作为window对象的属性和方法创建的
  4. 执行环境:
    • 每个函数都有自己的执行环境,当执行流进入一个函数时,函数的环境就会被推入一个环境栈中。而在函数执行之后,栈将其环境弹出,把控制权返回给之前的执行环境。
    • 内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境中的任何变量和函数。这些环境之间的练习都是线性的,有次序的。每个环境都可以向上搜索作用域链,以查询变量和函数名。但任何环境都能通过向下搜索作用域链而进入另一个执行环境
  5. 作用域链:
    • 用途:保证对执行环境有权访问的所有变量和函数的有序访问。
    • 原理:作用域链中的下一个变量来自包含(外部)环境,而再下一个变量对象则来自下一个包含环境。这样一直延伸到全局执行环境;全局执行环境的变量对象始终都是作用域中的最后一个对象。
  6. JavaScript中没有块级作用域
  7. 使用 var 声明的变量会自动被添加到最接近环境中
    • 在函数内部,最接近的环境就是函数的局部环境
    • 如果初始化变量时没有使用 var 声明,变量会自动添加到全局环境

三. 内存问题-垃圾收集

  1. JavaScript具有自动垃圾收集机制
  2. 垃圾收集机制工作原理:
    • 找出那些不再继续使用的变量,然后释放其内存。垃圾回收机制会按照固定的时间间隔,周期性的执行这一操作
    • 垃圾收集器必须跟踪哪个变量有用,哪个变量没用,对于再有用的变量打上标记,以备将来收回其占用内存
  3. 垃圾收集器实现方式
    1. 标记清除:垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记。然后,它会去掉环境中的变量以及被环境中的变量引用的变量的标记。而在此之后再被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。
    2. 引用计数:记录每一个值被引用的次数,当某个值的引用次数为0的时候,说明它没有被引用,即可回收。
  4. 解除引用:
    • 一旦数据不再用,最好通过将其值设置为 null 来释放其引用。
    • 解除一个值的引用并不意味着自动回收该值所占用的内存。解除引用的真正作用是让值脱离执行环境,以便垃圾收集器下次运行时可以将其回收

联系我,聊前端,聊生活,要学习资料。欢迎来撩 github 同步更新:github.com/mapengfei47…

持续日更,敬请期待