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

时间:2011-09-21 02:31:09

标签: javascript terminology

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

2 个答案:

答案 0 :(得分:5)

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

  • LexicalEnvironment
  • VariableEnvironment
  • ThisBinding

通常,术语“变量范围”用作LexicalEnvironment组件的同义词。因此,从技术上讲,是的,存在差异。然而,在实践中,术语使用情况变化很大,并不一定与规范一致。


更长的回答:To the ECMA-262-Spec-cave!

  

10.3执行上下文

     

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

     

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

     

...

     

执行上下文的LexicalEnvironment和VariableEnvironment组件始终是Lexical   环境。当执行上下文创建其LexicalEnvironment和VariableEnvironment时   组件最初具有相同的值。 VariableEnvironment组件的值永远不会更改   而在执行代码时,LexicalEnvironment组件的值可能会发生变化   执行上下文。

     

在大多数情况下,只有正在运行的执行上下文(执行上下文堆栈的顶部)才是直接的   由本规范中的算法操纵。因此当术语“LexicalEnvironment”时,   “VariableEnvironment”和“ThisBinding”在没有限定的情况下使用,它们参考了那些   正在运行的执行上下文的组件。

     

...

     

10.3.1标识符解析

     

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

     
      
  1. env 成为正在运行的执行上下文的LexicalEnvironment。
  2.   
  3. 如果正在评估的语法生成包含在严格模式代码中,那么让 strict true,   否则让严格成为false
  4.   
  5. 返回调用GetIdentifierReference函数的结果,将 env Identifier strict 作为参数传递。
  6.         

    评估标识符的结果始终是Reference类型的值及其引用的名称组件   等于标识符字符串。

答案 1 :(得分:0)

一般来说,“scope”指的是某种东西 - 例如变量 - 存在或以某种方式有效的区间。

“Context”有时指的是当前使用特定框架操作的对象可访问的对象集 - 作为该框架规范的一部分。这就是马特所提供的。但有时它意味着“范围”。 “在当前函数的范围内”与“在当前函数的上下文中”几乎相同。

您通常可以从...上下文中了解上下文的含义。

我不是Javascript专家!