考虑以下 JavaScript 片段:
function outer() {
var x = 10;
function inner() {
var y = 20;
}
}
显然,该变量y
在 的上下文中不可用outer
。outer
遵循 ES5 规范中的流程告诉我们,当我们进入执行上下文时会发生这种情况:
我们进入一个新的执行上下文(10.4)
由于它是一个函数,我们按照输入函数代码 (10.4.3)中概述的步骤进行操作
- 令code为F的 [[Code]] 内部属性的值。
创建函数对象 (13.2)中描述了函数的 [[Code]] 内部属性。它指的是语法指定的FunctionBody (函数的全部内容):
function
标识符(
FormalParameterList opt) {
FunctionBody}
此时我们进入声明绑定实例化(10.5)部分并执行以下操作:
为函数的形式参数列表中的任何参数创建绑定
对于代码中的每个函数声明:
Function
在函数标识符和对象之间创建当前范围内的绑定(按照函数定义 (13)中的指定创建)没有什么可说的“从代码中删除我们刚刚处理的函数”
arguments
为对象创建绑定对于代码中的每个变量声明:
- 在当前范围内为变量标识符创建绑定
我的问题是,为什么此时没有为内部函数的变量声明创建绑定?似乎代码仍应包含外部函数的整个源文本(其中将包括内部函数的源文本)。我正在规范中寻找解释行为的东西。
更新,更清楚一点:我问的是当我们进入outer
函数的上下文时会发生什么。该inner
函数永远不会被调用,我也不关心当我们从outer
函数返回时会发生什么。我完全对规范定义的过程感兴趣,即在进入新的执行上下文时为变量声明创建绑定。