变量、作用域和内存问题

ECMAScript 数据类型

基本类型(5种):

  • UndefinedNullBooleanNumberString
  • typeof() 检测一个变量是否是基本数据类型
  • 基本类型在内存中占据固定大小的空间,因此被保存在 内存中。
  • 从一个变量向另一个变量复制 基本类型 的值,会创建这个值的一个副本。

引用类型:

  • 保存在内存中的对象。
  • 引用类型的值是对象,保存在 内存中。
  • instanceof() 检测是什么类型的对象

    • alert (color instanceof Array)  // true or false
      alert (persion instanceof Object) // true
  • 包含引用类型值的变量实际上包含的并不是对象本身,而是一个指向该对象的指针。
  • 从一个变量向另一个变量复制 引用类型 的值,复制的其实是指针,因此两个变量最终都指向同一个对象。

执行环境及作用域

所有变量(包括基本类型和引用类型)都存在于一个执行环境当中,这个执行环境(也称为作用域)决定了变量的生命周期,以及哪一部分代码可以访问其中的变量。

执行环境的类型有两种:

  • 全局(全局执行环境)
  • 局部(函数执行环境)

每个环境都可以向上搜索作用域链,以查询变量和函数名;但任何环境都不能通过向下搜索作用域链而进入另一个执行环境。(内部可通过作用域链访问外部,外部不能访问内部)。

延长作用域链

当执行流进入下列任何一个语句时,作用域链就会得到加长:

  • try-catch 语句的catch
  • with语句

没有块级作用域

对于 javascript 来说,由 for 语句创建的变量 i 在 for 循环结束后,也依旧存在于循环外部的执行环境中。

for (var i =0; i < 10; i++) {
    doSomething(i);
}
alert(i); //10
  • 声明变量:

    • 使用 var 声明:添加到最接近的环境中。
    • 不用 var 声明,自动添加到全局环境。所以建议一定要先声明。
  • 查询标识符:

    • 从作用域的前端开始,向上逐级查询与给定名字匹配的标识符。

垃圾收集

JavaScript 具有自动垃圾收集机制,也就是说,执行环境会负责管理代码执行过程中使用的内存。

原理:找出那些不再使用的变量,然后释放其占用的内存。垃圾回收器会按照固定的时间间隔周期性的执行这一操作。

通常有两个策略:

标记清除(最常用的垃圾清除方式)

引用计数(不太常见)


MandyShen
166 声望21 粉丝