ECMAScript变量包含两种类型的值:
基本类型值----简单的数据段
引用类型值----有多个值构成的对象
复制变量值:
基本类型值的复制---会在变量对象上创建一个新值。新复制的比变量和原变量彼此之间不会有影响
引用类型值的复制---也会将存储在变量对象中的只复制一份到为新变量分配的空间中,但是这个值的副本实际上是一个指 针,这个指针指向存储在堆中的一个对象。复制结束后两个变量将应用同一个对象,因此改变其中一个 变量会影响到另一个变量。
执行环境、变量对象及作用域:
- 执行环境定义了变量或函数有权访问的其他数据,决定了各自的行为。
在JavaScript中,执行环境分为三种:
》全局执行环境---一旦代码被载入,引擎最先进入的就是这个环境。在浏览器中全局环境就是window对象。
》函数执行环境---当执行一个函数时,js引擎进入执行环境。某个执行环境中的代码执行完之后,该环境销毁,保存在其中的所有变量 和函 数也随之销毁。
》Eval执行环境---同上
建立一个执行环境分为两个阶段:
》进入上下文阶段:发生函数调用,进入执行环境时,此时具体的函数代码还没有执行
》执行代码阶段:进行变量赋值,函数引用,以及执行其他代码。
- 每个执行环境都有一个与之关联的变量对象。
- 变量对象保存了执行环境中的所有变量和函数。(、函数的形参 、var声明的变量 、函数声明(但不包含函数表达式))
变量对象存在的两种方式:一种是全局对象(用Global表示)存放着全局属性和函数,我们可以通过this关键字引用到该对象。
一种是函数执行环境中定义的变量对象,其在函数执行上下文中是不能直接访问的,被称为活动对象。 - 作用域:当代码在一个环境中执行时,会创建变量对象的一个作用域链,作用域链的前端,始终都是当前执行的代码所在的变量对象。如果这个环境是函数,则将其活动对象(activation object)作为变量对象。活动对 象在最开始时只包含一个变量,即 arguments 对象(这个对象在全局环境中是不存在的)。作用域链中 的下一个变量对象来自包含(外部)环境,而再下一个变量对象则来自下一个包含环境。这样,一直延 续到全局执行环境;全局执行环境的变量对象始终都是作用域链中的最后一个对象。
- 延长作用域链
执行环境的类型总共有两种——全局和局部(函数)。因为有些语句可以在作用域链的前端临时增加一个变量对象,该变量会在代码执 行后被移除。当执行流进入到下列任何一个语句时,作用域链就会得到加长:
》try-catch语句的catch块
》with语句
对 with 语句来说,会将指定的对象添加到 作用域链中。
对 catch 语句来说,会创建一个新的变量对象
总结::
- 确定一个值是哪种基本类型可以使用 typeof 操作符,而确定一个值是哪种引用类型可以使用 instanceof 操作符。
- 所有变量(包括基本类型和引用类型)都存在于一个执行环境(也称为作用域)当中,这个执 行环境决定了变量的生命周期,以及哪一部分代码可以访问其中的变量。以下是关于执行环境的几 点总结:
执行环境有全局执行环境(也称为全局环境)和函数执行环境之分;
每次进入一个新执行环境,都会创建一个用于搜索变量和函数的作用域链;
函数的局部环境不仅有权访问函数作用域中的变量,而且有权访问其包含(父)环境,乃至全 局环境;
全局环境只能访问在全局环境中定义的变量和函数,而不能直接访问局部环境中的任何数据;
变量的执行环境有助于确定应该何时释放内存。