//Version A:
var let = true;
console.log(let);//true
//Version B:
let let = 0; //syntax Error: let is disallowed as a lexically bound name
console.log(let);
我们是否允许使用let
而不是var
创建名称为let
的变量?通过这个实验,是否也意味着变量名let
可以在全局级别存在但在某些范围级别不存在?但是全球是否考虑范围?
答案 0 :(得分:4)
因为规范是这样说的。
13.3.1 Let和Const声明
13.3.1.1静态语义:早期错误
LexicalDeclaration
:
LetOrConst BindingList;
- 如果 BindingList 的BoundNames包含
"let"
,则语法错误。
variable statement specification没有此类限制,可能是因为let
在定义var
时未使用,并且更改var
的规范将会破坏变化
答案 1 :(得分:3)
是否有任何特殊原因我们允许使用var创建名称变量但不允许使用?
var
允许向后兼容。
let
声明不存在,因此let
可以作为变量名自由使用。在let
是一个非常好的变量名称时,更改语言以停止允许该变量名称可能会破坏在ES2015存在之前编写的应用程序。 (涵盖了二十年 - 1995年至2015年!)
由于let
是一项新功能,因此没有现有代码可以中断,并且禁止let
作为变量名称可能会避免语法混淆的潜在来源。