执行上下文 Execution Context
当控制器转到可执行代码时,就会进入一个执行上下文,形成一个作用域。
- 全局环境 首次运行时会进入该环境
- 函数环境 函数被调用时,会进入当前函数中执行代码
- 
    eval 可执行 JS 代码 - 栈底永远是全局上下文
- 栈顶是正在执行的上下文
 
var color = "blue";
function changeColor() {
  var anotherColor = "red";
  function swapColors() {
    var tempColor = anotherColor;
    anotherColor = color;
    color = tempColor;
  }
  swapColors();
}
changeColor();
- 
    执行顺序  
变量对象
- 
    执行上下文的生命周期- 创建阶段 == 创建变量对象 » 建立作用域 » 确认 this 指向
- 代码执行阶段 == 创建成功后 » 开始执行代码 » 变量赋值 » 函数引用
  
- 
    变量对象 Variable Object变量对象的创建依次经历以下几个过程 - 建立 arguments 对象:检查当前上下文中的参数,建立该对象下的属性与属性值 (函数参数)
- 检查当前上下文的函数声明(使用 function 关键字声明的函数)。在变量对象中以函数名建立一个属性,属性值指向该函数所在的内存地址
- 检查当前上下文中的变量声明,在变量对象中以变量名建立一个属性,属性值为 undefined (如变量和函数同名,优先函数值)
  
- 
    变量提升- 函数及变量的声明将被提升到函数最顶部
- 变量可以在使用后生声明,也就是变量可以先使用在声明
- 函数声明优先级高于变量声明的优先级,并且函数声明和函数定义部分一起被提升
 
参见