在ECMAScript规范v5中缺少关于进入在全局作用域中声明的函数时会发生什么的详细信息

Details about what happens when entering a function declared in the global scope is missing from ECMAScript Specification v5?

本文关键字:函数 详细信息 什么 声明 全局 v5 规范 ECMAScript 于进入 作用域      更新时间:2023-09-26

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>

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

我想你误解了这句话(来自§10.4.3,输入功能代码):

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

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

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

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

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