说一说你对JS上下文栈和作用域链的理解?
into-piece opened this issue · comments
intopiece commented
JS执行上下文
执行上下文(Execution Contexts) 是 ECMAScript 代码 运行时(runtime) 的上下文环境。
执行上下文类型分为:
- 全局执行上下文
- 函数执行上下文
- eval函数执行上下文(不被推荐)
执行上下文创建过程中,需要做以下几件事:
- 创建变量对象:首先初始化函数的参数arguments,提升函数声明和变量声明。
- 创建作用域链(Scope Chain):在执行期上下文的创建阶段,作用域链是在变量对象之后创建的。
- 确定this的值,即 ResolveThisBinding
作用域
作用域负责收集和维护由所有声明的标识符(变量)组成的一系列查询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限。—— 摘录自《你不知道的JavaScript》(上卷)
作用域分为:
- 全局作用域
- 函数作用域
- 块级作用域
JS执行上下文栈(后面简称执行栈)
执行栈,也叫做调用栈,具有 LIFO (后进先出) 结构,用于存储在代码执行期间创建的所有执行上下文。
作用域链
作用域 负责收集和维护由所有声明的标识符(变量)组成的一系列查询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限。-- 《你不知道的JavaScript(上卷)》
从上面两个话题,我们可以知道,除 全局作用域(global scope) 外,每个作用域始终连接到其背后的一个或多个作用域,从而形成 作用域链(scope chain) 。全局作用域(global scope) 没有任何父级,这也是有意义的,因为它位于层次结构的顶部。