into-piece / Step-By-Step

每天一题向前端架构师前进

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

说一说你对JS上下文栈和作用域链的理解?

into-piece opened this issue · comments

JS执行上下文

执行上下文(Execution Contexts) 是 ECMAScript 代码 运行时(runtime) 的上下文环境。

执行上下文类型分为:

  • 全局执行上下文
  • 函数执行上下文
  • eval函数执行上下文(不被推荐)

执行上下文创建过程中,需要做以下几件事:

  1. 创建变量对象:首先初始化函数的参数arguments,提升函数声明和变量声明。
  2. 创建作用域链(Scope Chain):在执行期上下文的创建阶段,作用域链是在变量对象之后创建的。
  3. 确定this的值,即 ResolveThisBinding

作用域

作用域负责收集和维护由所有声明的标识符(变量)组成的一系列查询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限。—— 摘录自《你不知道的JavaScript》(上卷)

作用域分为:

  • 全局作用域
  • 函数作用域
  • 块级作用域

JS执行上下文栈(后面简称执行栈)

执行栈,也叫做调用栈,具有 LIFO (后进先出) 结构,用于存储在代码执行期间创建的所有执行上下文。

作用域链

作用域 负责收集和维护由所有声明的标识符(变量)组成的一系列查询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限。-- 《你不知道的JavaScript(上卷)》
从上面两个话题,我们可以知道,除 全局作用域(global scope) 外,每个作用域始终连接到其背后的一个或多个作用域,从而形成 作用域链(scope chain) 。全局作用域(global scope) 没有任何父级,这也是有意义的,因为它位于层次结构的顶部。