ECMAScript规范详细说明了当控制进入 function within a function 的执行上下文时会发生什么。
function foo() {
function bar() {
}
bar(); // Control will be given to the bar function. Details specified by spec
}
还有一个解释当控制enters global code时会发生什么。
<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]]属性是什么。我假设它将是全局执行上下文的词法环境,但在规范中没有任何指定。
答案 0 :(得分:3)
我认为你误解了那句话(来自§10.4.3, Entering Function Code):
当控件进入函数对象
F
中包含的函数代码的执行上下文,提供的调用者thisArg
以及调用者提供的argumentsList
[...]时,执行以下步骤
这并不意味着输入的函数必须包含在F
中,但输入的代码包含在函数F
中(您正在调用)。
[[Call]]
method在calling a function无法区分全局/本地声明或调用函数时使用的{{3}}。
答案 1 :(得分:0)
全局代码中声明的函数在10.4.1的步骤2中的全局代码的声明绑定实例化期间实例化。
这是通过10.5的步骤5.c完成的,它通过第13节中的第一个算法实际创建了每个这样的函数对象。注意,这将函数的[[Scope]]设置为当前执行上下文的VariableEnvironment。当前执行上下文由10.4.1的第1步(通过10.4.1.1)设置为全局环境。