1:执行环境(Execution Context,也称为"执行上下文")是JavaScript中最为重要的一个概念。而且比较抽象。执行环境定义了变量或函数有权访问的其它数据,决定了各自的行为。当JavaScript代码执行的时候,会进入不同的执行环境,这些不同的执行环境就构成了执行环境栈。

 

2:JavaScript中主要存在三种执行环境:

-- 全局执行环境

JavaScript代码执行的默认环境。JavaScript代码在浏览器中执行的时候,通常被默认为window对象,所有的全局变量和函数都作为window对象的属性和方法存在。当执行环境中的代码执行完毕之后,执行环境被销毁,其中的所有变量和函数也随之销毁。对于全局执行环境来说,当关闭网页或浏览器时,该环境被销毁。

-- 函数执行环境

  当执行一个JavaScript函数时,函数的执行环境被压入环境栈中,执行完毕之后,栈将执行环境推出,将控制权转交给之前的执行环境。

-- Eval环境

   执行eval()函数时创建的执行环境。

 

3:每个执行环境都有三个重要的属性,变量对象(VariableObject-VO)、作用域链(scope chain)和this。

 

4:变量对象和活动对象(variable object 和 activation object)

每个执行环境都有一个与之关联的变量对象(variable object),环境中定义的所有变量和函数都保存在这个对象中。当代码在一个环境中执行时,会创建当前变量对象的一个作用域链(scope chain)。作用域链的最前端,始终是当前执行环境的变量对象。如果执行环境是函数,则其活动对象(activation object)作为变量对象。作用域链的下一个变量对象来自于父执行环境,而再下一个变量对象来自于父环境的外部环境,以此类推构成完整的作用域链,而最外层的变量对象始终是全局执行环境的变量对象。作用域链的作用是保证对执行环境有权访问的所有变量和函数的有序访问。

一般来说,变量对象(VO)中包含以下信息:

1:变量

2:函数声明

3:函数的形参