重要概念
**EC**:函数执行环境(或执行上下文),Execution Context**ECS**:执行环境栈,Execution Context Stack**VO**:变量对象,Variable Object**AO**:活动对象,Active Object**scope chain**:作用域链
AO其实就是被激活的VO
变量或函数的上下文决定了它们可以访问哪些数据以及它们的行为。
每个上下文都有一个关联的变量对象,这个上下文中定义的所有变量和函数都存在于这个对象上。
全局上下文是最外层的上下文,浏览器中就是 window 对象。所有 var 定义的全局变量、函数都会成为 window 对象的属性和方法。let、const的顶级声明不会定义在全局上下文,但作用域链解析的效果是一样的。
上下文在其所有代码都执行完毕后会被销毁,包括定义在它上面的所有变量和函数。全局上下文在网页关闭时才会被销毁。
上下文中的代码执行时,会创建变量对象的作用域链。当前正在执行的上下文的变量对象始终在最前。
若上下文是一个函数,则其活动对象用作为变量对象。
代码执行的标识符(变量之类的)解析是沿作用域链逐级向上查找的。作用域链的最顶端就是全局上下文。
内部上下文可以通过作用域链访问到外部上下文中的一切,但外部的不能访问内部的。
函数参数 被认为是当前上下文中的变量。
可以实现内部访问外部变量,内部覆盖局部变量等。
