2013-02-22 41 views
5

我正在阅读ECMA 262 5 specification的执行上下文/词汇环境部分。它指出了以下内容:(强调增加)函数表达式是否有其自己的作用域/词法环境

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

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

编辑:我注意到,功能码将有its own execution context,这就是为什么我也困惑,为什么函数表达式没有在词法环境一节中提到。

+4

因为例子列表以“such as”开头,所以我不认为它是详尽无遗的。 – Pointy 2013-02-22 22:41:11

+0

[第13节](http://www.ecma-international.org/ecma-262/5.1/#sec-13)似乎表明,仅为具有名称的函数表达式创建新的词汇环境(而不是为匿名函数表达式或函数声明)。但我必须错误地解​​释它。 – 2013-02-22 23:06:33

回答

3

是,函数获得(§10.4.3 )当它被调用时它自己的ExecutionContext§13.2.1)。该新的上下文使用新的LexicalEnvironment(由NewDeclarativeEnvironment,§10.2.2.2创建)初始化,从[[Scope]]导出的函数 - 即LexicalEnvironment它在(§13)中被声明/“表达”。

正如@Pointy所指出的那样,您捏造的句子并没有详尽地列出它们:“...某些[结构],如......”。

2

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

(这可能是更正确的说,实例化的函数有一个范围当它被称为,而且每次调用产生不同范围。)

3

如果名称包含在函数表达式中,那么该名称将成为只读绑定,该函数将会影响具有相同名称的任何外部声明。但是这种绑定本身可能被函数内的形式参数或局部声明所遮蔽。功能名称的这种绑定仅针对名为FunctionExpressions而不是匿名FunctionExpressions函数声明创建。在周围的变量环境中创建绑定函数声明的名称。

这里是一个更详细的explantion引用ES5.1规范:

有一个函数对象相关联的一个以上的环境记录。每当调用函数时,都会创建一个新的DeclarativeEnvironmentRecord以包含该特定函数调用的本地绑定。该记录既成为变量环境又成为为该调用创建的ExecutionContext的最初LexicalEnvironment。这在第10.4.3节中有规定。

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

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

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

相关问题