执行上下文和作用域这两个术语有什么区别吗?

5

我想知道它们是否是同一件事,因为有些程序员说“作用域”,而其他人则说“执行上下文”。


1
我在不需要“规范精确”的情况下经常使用作用域。它并不能涵盖执行上下文的所有方面,但可以方便地讨论变量可见性(词法作用域)。它也更具有“语言中立性”。 - user166390
2个回答

8
简短回答:根据规范,一个“执行上下文”由三个组件组成:

  • 词法环境
  • 变量环境
  • This 绑定

一般来说,“变量作用域”这个术语被用作词法环境组件的同义词。因此,严格地说,是有区别的。然而,在实践中,术语的使用方式千差万别,并不一定与规范相符。


更详细的回答:请参阅 ECMA-262 规范!

10.3 执行上下文

当控制权转移到 ECMAScript 可执行代码时,就进入了一个 执行上下文。活动的执行上下文逻辑上形成一个栈。该逻辑栈上的顶部执行上下文是正在运行的执行上下文。每当从当前正在运行的执行上下文关联的可执行代码转移到不与该执行上下文关联的可执行代码时,都会创建一个新的执行上下文。新创建的执行上下文被推入堆栈并成为正在运行的执行上下文。

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

...

执行上下文的 LexicalEnvironment 和 VariableEnvironment 组件始终是词法环境。创建执行上下文时,它的 LexicalEnvironment 和 VariableEnvironment 组件最初具有相同的值。VariableEnvironment 组件的值永远不会改变,而 LexicalEnvironment 组件的值可能会在执行执行上下文内部的代码期间更改。

在大多数情况下,只有运行中的执行上下文(堆栈顶部)才会直接受到本规范算法的操作。因此,当使用“LexicalEnvironment”、“VariableEnvironment”和“ThisBinding”这些术语而没有限定词时,它们是指正在运行的执行上下文的这些组件。

...

10.3.1 标识符解析

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

  1. env 为正在运行的执行上下文的 LexicalEnvironment。
  2. 如果正在评估的语法产生式包含在严格模式代码中,则让 stricttrue,否则让 strictfalse
  3. 返回调用 GetIdentifierReference 函数并传递 envIdentifierstrict 作为参数的结果。

评估标识符的结果始终是类型为“引用”的值,其引用名称组件等于 Identifier 字符串。


LexicalEnvironmentVariableEnvironment 有什么区别?前者只是指“作用域”吗? - doubleOrt
如果我之前的评论关于LexicalEnvironment的假设是正确的,那么我认为执行上下文是指任何具有独立作用域和自己的this绑定的东西。 - doubleOrt
我特意登录以点赞你的留言! - Vladimir

0

通常 "scope" 指的是某些东西 - 例如变量 - 存在或以某种方式有效的区间。

"上下文"有时指的是一组对象,这些对象可以作为框架的一部分被访问到。这是框架规范的一部分。这就是 Matt 提供的内容。但有时它的意思类似于 "作用域"。"在当前函数的作用域内" 的意思与 "在当前函数的上下文中" 的意思几乎相同。

通常您可以从上下文中判断出上下文的哪个含义是正确的。

我不是 Javascript 专家!


你的帖子是一个例子,说明在讨论中应该谨慎使用技术术语。一般术语“上下文”可能包括一般环境、其他函数、目的等,而特定术语“执行上下文”则由ECMA-262精确描述。例如,你可能会看到人们将函数的this关键字称为它的“上下文”,这既不符合一般意义,也不符合特定含义,这就是我倾向于在这一点上挑剔的原因。 :-) - RobG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接