5

我正在阅读ECMA 262 5 规范的执行上下文/词法环境部分。它说明了以下内容:(已添加重点)

词法环境是一种规范类型,用于根据 ECMAScript 代码的词法嵌套结构定义标识符与特定变量和函数的关联。一个词法环境由一个环境记录和一个对外部词法环境的可能为空的引用组成。通常,词法环境与 ECMAScript 代码的某些特定句法结构相关联,例如FunctionDeclaration、 WithStatement 或 TryStatement 的 Catch 子句,并且每次评估此类代码时都会创建一个新的词法环境。

我注意到它没有说明为函数表达式创建词法环境。是为函数表达式创建词法环境,还是仅为函数声明创建词法环境?我错过了什么吗?

编辑:我注意到函数代码将有自己的执行上下文,这就是为什么我也很困惑为什么在词法环境部分没有提到函数表达式。

4

3 回答 3

3
于 2013-02-23T00:14:03.160 回答
3

如果名称包含在FunctionExpression中,则该名称将成为一个只读绑定,它会隐藏任何同名的外部声明。但是该绑定本身可能会被函数中的形式参数或局部声明所掩盖。函数名称的这种绑定只为命名的FunctionExpressions而不是为匿名FunctionExpressionsFunctionDeclarations创建。FunctionDeclaration的名称绑定是在周围的 VariableEnvironment 中创建的。

这是参考 ES5.1 规范的更详细的解释:

与功能对象关联的环境记录不止一个。每当调用一个函数时,都会创建一个新的 DeclarativeEnvironmentRecord 以包含该特定函数调用的本地绑定。该记录成为为该调用创建的 ExecutionContext 的 VariableEnvironment 和初始 LexicalEnvironment。这在第 10.4.3 节中有详细说明。

创建此环境记录时,其“外部环境”设置为正在调用的函数对象的 [[Scope]] 内部属性的值。(第 5 行,10.4.3)外部环境为所有非本地声明提供绑定。[[Scope]] 在创建函数对象时设置(参见第 13 节和第 13.2 节中的语义)。因此,特定函数对象的每个不同调用都有不同的本地环境,但该函数的所有调用共享相同的外部 [[Scope]]。

对于大多数函数,捕获的 [[Scope]] 只是创建函数时处于活动状态的 ExecutionContext 的 LexicalEnvironment。但是,包含标识符作为函数名称的FunctionExpressions在其 [[Scope]] 链的头部有一个额外的 DeclarativeEnvironmentRecord 插入。(参见第 13 节中第三种算法的步骤 1-3)。

这个额外的环境记录用于捕获 FunctionExpression 中给定的函数名称的绑定

于 2013-02-24T18:02:02.140 回答
2

实例化的函数具有范围。它是作为函数声明语句的一部分还是作为函数实例化表达式的一部分实例化并不重要。

(说一个实例化的函数在被调用时有一个作用域可能更正确,并且每次调用都会产生一个不同的作用域。)

于 2013-02-22T22:39:30.713 回答