执行上下文和范围之间是否存在差异?

Jam*_*air 2 javascript terminology

只是想知道它们是否是同一个东西,因为一些程序员说"范围",而其他人说"执行上下文".

Mat*_*all 5

简短回答:执行上下文由规范定义,包含3个组件:

  • LexicalEnvironment
  • VariableEnvironment
  • ThisBinding

通常,术语"变量范围"用作LexicalEnvironment组件的同义词.所以,从技术上讲,是的,存在差异.然而,在实践中,术语的使用变化很大,并不一定与规范一致.


更长的答案:到ECMA-262-Spec-cave!

10.3执行上下文

当控件转移到ECMAScript可执行代码时,控件正在进入 执行上下文.活动执行上下文在逻辑上形成堆栈.此逻辑堆栈上的最高执行上下文是正在运行的执行上下文.每当控制从与当前运行的执行上下文相关联的可执行代码转移到与该执行上下文无关的可执行代码时,就创建新的执行上下文.新创建的执行上下文被压入堆栈并成为正在运行的执行上下文.

执行上下文包含跟踪其关联代码的执行进度所需的任何状态.

...

执行上下文的LexicalEnvironment和VariableEnvironment组件始终是Lexical Environments.创建执行上下文时,其LexicalEnvironment和VariableEnvironment组件最初具有相同的值.在执行上下文中执行代码期间,LexicalEnvironment组件的值可能会更改,VariableEnvironment组件的值永远不会更改.

在大多数情况下,只有正在运行的执行上下文(执行上下文堆栈的顶部)由本规范中的算法直接操作.因此,当使用术语"LexicalEnvironment","VariableEnvironment"和"ThisBinding"而没有限定条件时,它们引用了正在运行的执行上下文的那些组件.

...

10.3.1标识符解析

标识符解析是使用正在运行的执行上下文的LexicalEnvironment 确定标识符绑定的过程 .在执行ECMAScript代码期间,使用以下算法评估语法生成 PrimaryExpression:Identifier:

  1. env成为正在运行的执行上下文的LexicalEnvironment.
  2. 如果被评估的句法生产包含在严格模式代码,然后让 严格 BE true,不然,严格 BE false.
  3. 返回调用GetIdentifierReference函数的结果,将env,Identifierstrict作为参数传递.

评估标识符的结果始终是Reference类型的值,其引用的名称组件等于Identifier String.