![](/img/trans.png)
[英]Redeclaration with var works but not with let in Chrome Snippets
[英]Redeclaration in function body with let and var
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
失败? 我在算法中错过了哪些步骤?
这就是所谓的“早期错误”,本质上是一种规范声明应该抛出错误的断言。 在这种情况下, 14.1.2静态语义:早期错误指出:
如果
BoundNames
的FormalParameters
任何元素也出现在FunctionBody
的LexicallyDeclaredNames
中,则是语法错误。
当使用let
或const
您要将一个项目添加到LexicallyDeclaredNames
的结果中,这意味着它们将与在函数params( FormalParameters
)中声明的变量冲突。
使用var
不会出错,因为LexicallyDeclaredNames
不包含var
语句。 在此错误中包含var
将会是向后兼容的重大更改,因此它不会出错。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.