变量和作用域

88 阅读3分钟

一、基本类型和引用类型

JavaScript 变量可以用来保存两种类型的值:基本类型值和引用类型值。基本类型的值源自以下 5种基本数据类型:UndefinedNullBooleanNumberString。基本类型值和引用类型值具有以下特点:

     基本类型值在内存中占据固定大小的空间,因此被保存在栈内存中;

     从一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本;

     引用类型的值是对象,保存在堆内存中;

     包含引用类型值的变量是一个指向该对象的指针;

     从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终都指向同一个对象;

     确定一个值是哪种基本类型可以使用 typeof 操作符,而确定一个值是哪种引用类型可以使用instanceof 操作符。

二、执行环境

执行环境(Execution context,简称EC)或执行上下文对象(后面统一用执行上下文表示),它定义了变量或者函数有权访问的其他数据,决定了他们各自的行为。

每个执行环境都有一个与之关联的变量对象(variable object),环境中定义的所有变量和函数都保存在这个对象中。

在JavaScript中执行环境分三种:
1.全局执行环境 : 这个是最外围的执行环境,一旦代码被载入,引擎最先进入的就是这个环境。全局环境只能访问在全局环境中定义的变量和函数,而不能直接访问局部环境中的任何数据。在浏览器中,全局环境就是window对象,因此所有全局属性和函数都是作为window对象的属性和方法创建。全局执行环境直到应用程序退出时才会被销毁。

2.函数执行环境:当执行流执行一个函数时,javascript会创建一个新的函数执行环境,函数的局部环境不仅有权访问函数作用域中的变量,而且有权访问其包含(父)环境,乃至全局环境。函数执行环境中的代码执行完之后,该环境销毁,保存在其中的所有变量和函数定义也被之销毁。

3.Eval(一个普通函数,但是它有一个快速通道通向编译器,可以将string变成可执行的代码)执行环境 : Eval的执行环境和函数调用的执行环境相同。

三、作用域

当代码在一个环境中执行时,会创建变量对象的一个作用域链(scope chain)。作用域链的用途,是保证对执行环境有权访问的所有变量和函数的有序访问。作用域链的前端,始终都是当前执行的代码所在环境的变量对象。如果这个环境是函数,则将其活动对象(activation object)作为变量对象。

JavaScript没有块级作用域。