witch@&*weaves

闭包,词法环境,词法作用域,与执行上下文

词法环境(Lexical Environment),词法作用域,与执行上下文(Execution Context)主要是描述JS编译和执行代码的过程中的术语。

需要注意的是,词法作用域是只要定义便会存在,而词法环境和执行上下文是函数被调用/全局代码第一次执行时才会被创建的。

词法作用域是在源码里得到定义的,即变量在声明时便确定了自己的作用域。源码被调用进入执行阶段时,会分为编译和执行两个阶段,在编译阶段,源码会先被进行词法分析和语法分析,确认作用域规则,之后进入执行阶段,执行阶段会先进入创建阶段,此阶段会创建词法环境,建立执行上下文。

执行上下文也会因为执行的两个阶段拥有两个不同的阶段,第一个创建阶段随着编译创建执行上下文,随后创建词法环境,词法环境分为LexicalEnvironment component 和VariableEnvironment component ,每个环境又可以分为环境记录器和指向外部词法环境的引用outer两种,环境记录器包含变量声明,函数声明,以及函数的形参的声明式环境记录,以及对象环境记录(全局/with),lexical Enviroment主要包含let,const,class声明,variable Enviroment包含var声明和function。 除了词法环境,执行上下文也包含this。

(这也是为什么var声明和function声明会有提升,这都是为了在编译阶段将它们统一作为执行上下文创建)

只是将所有变量声明存入了内存,创建完成后,执行上下文会被压入执行栈,之后在执行阶段,也就是第二阶段,执行上下文会在此阶段为变量赋值,调用函数。(调用栈在创建时会自动先存入一个全局执行上下文[1],因为调用栈LIFO的原则也因为JS单线程的工作方式,每次只能有一个执行上下文处于运行状态。

#code