2

ECMAScript 规范详细介绍了当控制进入函数内函数的执行上下文时会发生什么。

function foo() {
  function bar() {

  }
  bar(); // Control will be given to the bar function.  Details specified by spec
}

还有一个解释当控制进入全局代码时会发生什么。

<script>
  // Entering global code!  Details specified by spec
</script>

但是,没有具体说明在为全局代码中定义的函数输入控制权时会发生什么。

<script>
  function foo() {
  }
  foo(); // Calling a function defined in the global environment...not specified by spec
</script>

编辑:这对我很重要的原因是因为我很好奇全局代码调用的函数的内部 [[Scope]] 属性是什么。我假设它将是全局执行上下文的词法环境,但在规范中没有指定这一点。

4

2 回答 2

3

我认为您误解了那句话(来自§10.4.3,输入功能代码):

当控制进入函数对象中包含的函数代码的执行上下文时,执行以下步骤F,提供的调用者thisArg和提供的调用者argumentsList[…]

这并不意味着输入的函数必须包含在 中F,而是表示输入的代码包含在函数F(您正在调用的函数)中。

调用函数时使用的[[Call]]方法不区分全局/局部声明或调用的函数。

于 2013-02-27T22:33:21.307 回答
0

在全局代码中声明的函数在 10.4.1 的步骤 2 中全局代码的声明绑定实例化期间被实例化。

这是通过 10.5 的步骤 5.c 完成的,该步骤实际上是通过第 13 节中的第一个算法创建每个这样的函数对象。请注意,这会将函数的 [[Scope]] 设置为当前执行上下文的 VariableEnvironment。当前执行上下文由 10.4.1 的第 1 步(通过 10.4.1.1)设置到全局环境。

于 2013-02-28T01:21:51.883 回答