使用let和var

时间:2017-10-16 07:16:42

标签: javascript ecmascript-6

function func(arg = 1) {
    var arg = 2; // success
    // let arg = 2; // SyntaxError: Identifier 'arg' has already been declared
}

我按照ECMA spec-7.0 FunctionDeclarationInstantiation算法查看为什么您可以使用var重新声明函数体中的变量。

在步骤21中,已初始化所有参数。但算法都使用 CreateMutableBinding 来初始化var(27.fi2)和let(34.b.ii.1)体内声明的变量,为什么var成功并let失败了吗?我在算法中错过了哪些步骤?

1 个答案:

答案 0 :(得分:1)

这就是所谓的"早期错误",这本质上是一个断言,规范声明应该抛出错误。在这种情况下,14.1.2 Static Semantics: Early Errors表示:

  

如果BoundNames的{​​{1}}的任何元素也出现在FormalParameters的{​​{1}}中,则语法错误。

当您使用LexicallyDeclaredNamesFunctionBody时,您正在向let的结果添加项目,这意味着它们将与函数参数中声明的变量冲突({{1} })。

使用const不会出错,因为LexicallyDeclaredNames不包含FormalParameters语句。在此错误中包含var s将是向后兼容性中断更改,因此它不会出错。