为什么 let=0 是有效的但 var=0 不是?

26
为什么不

let=0

不显示任何语法错误,但是

var=0

这是什么?(我在Safari上测试过)

然而,我试过了

console.log(let)

但是它有错误,似乎'let'不是一个已定义的变量。为什么会发生这种情况?


因为var是已定义的关键字,而let是在ES2015中定义的关键字,大多数浏览器尚不支持,所以它允许您创建一个名为let的新全局变量。 - Sundar Singh
你为什么要尝试给JavaScript关键字赋值呢? :o - Dominic
很好的发现 @MichałPerłakowski。 - T.J. Crowder
4个回答

36
因为`var`一直是关键字,但`let`不是。因此,当将`let`添加到语言中时,TC39委员会必须对其进行规定,以使使用`let`作为标识符的现有代码不会出错("不要破坏网络"是他们的主要规则之一,他们非常重视这一点)。所以,`let`在上下文中是一个关键字,例如`let`声明,但也可以是一个标识符:

let a = 42;                // Keyword, due to context
let = "I'm an identifier"; // Identifier, due to context 
console.log(a);
console.log(let);
注意:在严格模式("use strict")下,let不能用作标识符;在引入严格模式的规范中,当在严格模式下使用let和其他一些单词时进行了保留(请参见ECMAScript 5th edition §7.6.1.2),因为在该规范被采用之前,没有任何严格模式的代码存在,因此可以这样做。(它没有保留以后会成为关键字的每个单词,因此有时他们必须非常仔细地定义事物。例如,在严格模式下,async是一个完全有效的标识符,但在function之前具有特殊含义。)

"use strict";
let = "I'm an identifier"; // SyntaxError: Unexpected strict mode reserved word
console.log(let);


3

var是一个保留字,不能用作全局变量的名称。但是let同样也是一个保留字,并且与var不同之处在于它可以被用作变量名。

let是在ES6版本中添加的。为了兼容旧代码,其中变量名可能会使用let,将其用作名称仍是正确的。而var是从Javascript开始即添加的,因此为什么要禁止使用它呢。

let = 0;
console.log(let);


3

Javascript在ES5中有一组保留关键字:

break、do、instanceof、typeof、case、else、new、var、catch、finally、return、void、continue、for、switch、while、debugger、function、this、with、default、if、throw、delete、in、try

在JavaScript中,将保留关键字用作变量或函数名是非法的。例如,以下代码会抛出一个SyntaxError,其中指出“无法使用关键字‘delete’作为变量名”:

var delete = 1;

但在ES5中,使用ES6保留字(如let)作为变量名是完全可以的。

var let = 1;

ES5定义了两种语言模式modes。在引入ES5之前存在的常规JavaScript被认为是sloppy mode,而自ES5以来,JavaScript程序员可以选择在strict mode下编写他们的程序。严格模式引入了一组新的JavaScript规则,包括附加的保留字。这组关键字被称为FutureReservedWord。以下是列表:

implements,interface,let,package,private,protected,public, static,yield

在非严格模式的JavaScript中,不强制执行FutureReservedWord关键字。但在严格模式下,它们被视为保留字,将其用作变量名称是不合法的。

更多信息在此处

因此,如果不在严格模式下,可以使用let作为变量名。但var始终是一个保留关键字。

所以你可以做类似于

var let = "some thing uneasy!";
console.log(let);

但是你仍然无法做到

let let = 5;

这是因为从词法上来看它是不正确的。JS会将其视为多个声明,如果你使用逗号分隔你的声明,你不应该重复使用let。要么从每个声明中删除let,要么使用分号。


@Glorfindel 打字错误 :P 已修复! - void

1
这个问题已经得到了回答,只是想补充一下 - 根据 specletstatic 不属于关键字列表,除非它们在 严格模式 中被使用。在严格模式代码中letstatic 会通过静态语义限制而不是词法语法被视为保留关键字。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接