作用域

类型

ECMAScript 变量包含:基本类型值和引用类型值

基本类型值指的是 简单的数据段,而引用类型值指那些可能由多个值构成的对象。

基本数据类型:Undefined、Null、Boolean、Number 和 String


动态属性

我们不能给基本类型的值添加属性

var name = "Nicholas"; 
name.age = 27; 
alert(name.age); //undefined

复制变量值

基本类型就是值复制

当从一个变量向另一个变量复制引用类型的值时,同样也会将存储在变量对象中的值复制一份放到 为新变量分配的空间中。不同的是,这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一 个对象。


传递参数

为了证明对象是按值传递

function setName(obj) { 
 obj.name = "Nicholas"; 
 obj = new Object(); 
 obj.name = "Greg"; 
} 
var person = new Object(); 
setName(person); 
alert(person.name); //"Nicholas" 

当在函数内部重写 obj 时,这 个变量引用的就是一个局部对象了。而这个局部对象会在函数执行完毕后立即被销毁。


检查类型

typeof

var s = "Nicholas"; 
var b = true; 
var i = 22; 
var u; 
var n = null; 
var o = new Object(); 
alert(typeof s); //string 
alert(typeof i); //number 
alert(typeof b); //boolean 
alert(typeof u); //undefined 
alert(typeof n); //object 
alert(typeof o); //object

instanceof

alert(person instanceof Object); // 变量 person 是 Object 吗?
alert(colors instanceof Array); // 变量 colors 是 Array 吗?
alert(pattern instanceof RegExp); // 变量 pattern 是 RegExp 吗?

所有引用类型的值都是 Object 的实例。因此,在检测一个引用类型值和 Object 构造 函数时,instanceof 操作符始终会返回 true


执行环境及作用域

在 Web 浏览器中,全局执行环境被认为是 window 对象,因 此所有全局变量和函数都是作为 window 对象的属性和方法创建的。

全局执行环境直到应用程序退 出——例如关闭网页或浏览器——时才会被销毁

每个函数都有自己的执行环境

当代码在一个环境中执行时,会创建变量对象的一个作用域链(scope chain)。作用域链的用途,是 保证对执行环境有权访问的所有变量和函数的有序访问。

内部环境可以通过作用域链访问所有的外部环境,但 外部环境不能访问内部环境中的任何变量和函数


延长作用域链

然执行环境的类型总共只有两种——全局和局部(函数)

  • try-catch 语句的 catch 块
  • with 语句
function buildUrl() { 
 var qs = "?debug=true"; 
 with(location){ 
 var url = location.href + qs; 
 } 
 return url; 
} 

with 语句接收的是 location 对象,因此其变量对象中就包含了 location 对象的所有属 性和方法,而这个变量对象被添加到了作用域链的前端


没有块级作用域

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

  • 声明变量

使用 var 声明的变量会自动被添加到最接近的环境中

  • 查询标识符

    当在某个环境中为了读取或写入而引用一个标识符时,搜索过程从作用域链的前端开始,向上逐级查询与给定名字匹配的标识符。找到 了该标识符,搜索过程停止


垃圾收集

JavaScript 具有自动垃圾收集机制

这种垃圾收集机制的原理其实很简单:找出那些不再继续使用的变 量,然后释放其占用的内存

为此,垃圾收集器会按照固定的时间间隔, 周期性地执行这一操作


标记清除

JavaScript 中最常用的垃圾收集方式是标记清除

当变量进入环境时,就将这个变量标记为“进入环境”。

而当变量离开环境时,则将其 标记为“离开环境”

垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记。然后,它会去掉环境中的变量以及被环境中的变量引用的变量的标记。而在此之后再被加上标记 的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。


引用计数

不太常见的垃圾收集策略

引用计数的含义是跟踪记录每 个值被引用的次数

当声明了一个变量并将一个引用类型值赋给该变量时,则这个值的引用次数就是 1,如果同一个值又被赋给另一个变量,则该值的引用次数加 1。相反,如果包含对这个值引用的变量又取 得了另外一个值,则这个值的引用次数减 1。当这个值的引用次数变成 0 时,则说明没有办法再访问这 个值了,因而就可以将其占用的内存空间回收回来。