GlobalDeclarationInstantiation 附件语义中的早期错误

Early Error in annex semantics of GlobalDeclarationInstantiation

我找不到任何消息来源谈论规范中的下一点(让它成为 GlobalDeclarationInstantiation):

ii. If replacing the FunctionDeclaration f with a VariableStatement that has F as a BindingIdentifier would not produce any Early Errors for script, then

这一步我没看懂,这个错误说明什么?

我正在尝试找出附件中的这一步。因此,如果我们不使用 VariableStatement 替换 FunctionDeclartion,就不会出现错误。相反,如果我们进行替换,我们会得到错误。那它的例子是什么?

我认为可能适用于该替换的唯一 Script early errors

It is a Syntax Error if any element of the LexicallyDeclaredNames of ScriptBody also occurs in the VarDeclaredNames of ScriptBody.

所以让我们假设脚本

let x = 42;
{
  function x() {}
  console.log('block', typeof x);
}
console.log('global', typeof x, typeof window.x);

现在,如果我们用相应的变量声明替换函数声明,我们就会得到脚本

let x = 42;
{
  var x;
  console.log('block', typeof x);
}
console.log('global', typeof x, typeof window.x);

导致语法错误。所以它 而不是 运行 为函数创建全局变量的条件步骤。

如果与同一脚本声明的词法变量没有冲突,则旧版 Web 兼容性语义会生效:

let y = 42;
{
  function x() {}
  console.log('block', typeof x);
}
console.log('global', typeof x, typeof window.x);