繁体   English   中英

使用let和var在函数体内重新声明

[英]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静态语义:早期错误指出:

如果BoundNamesFormalParameters任何元素也出现在FunctionBodyLexicallyDeclaredNames中,则是语法错误。

当使用letconst您要将一个项目添加到LexicallyDeclaredNames的结果中,这意味着它们将与在函数params( FormalParameters )中声明的变量冲突。

使用var不会出错,因为LexicallyDeclaredNames不包含var语句。 在此错误中包含var将会是向后兼容的重大更改,因此它不会出错。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM