为什么 let=0 有效但 var=0 无效?



为什么不

let=0

显示任何语法错误,但

var=0

是吗?(我在野生动物园上测试过)

但是我试过

console.log(let)

但它有错误,似乎"let"不是一个已经定义的变量。为什么会这样呢?

因为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 第 5 版 §7.6.1.2),因为在该规范采用之前当然不存在严格模式代码,所以他们可以这样做。(它并没有保留每一个最终成为关键字的单词,所以有时他们真的必须非常仔细地定义事物。例如,即使在严格模式下,async也是一个完全有效的标识符,但在function之前具有特殊含义。

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

var是一个保留字,它不能是全局变量的名称。但let也是一个保留的词。它与var不同,它可以用作变量名。

let是在ES6版本中添加的。为了与旧代码兼容,旧代码可以将变量名称作为let,将其用作名称仍然是正确的。var是从Javascript的开头添加的,所以为什么它被禁止。

let = 0;
console.log(let);

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

break, do, instanceof, typeof, case, else, new, var, catch, final, 返回, 无效, 继续, 为, 切换, 同时, 调试器, 函数, 这个, with, default, if, throw, delete, in, try

在 JavaScript 中使用保留关键字作为变量或函数名称是非法的。例如,以下代码抛出一个SyntaxError,上面写着Cannot use the keyword ‘delete’ as a variable name

var delete = 1;

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

var let = 1;

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

实现, 接口, 让, 包, 私有, 受保护, 公共, 静态,产量

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

在此处阅读更多内容

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

所以你可以做一些类似的事情

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

但你还是做不到

let let = 5;

因为从词法上讲这是不正确的。JS假设它是多个声明,如果你用逗号分隔你的声明,你不应该重复let。从每个声明中删除 let 或改用分号。

这个问题已经回答了,只是为了补充一下——

根据规范,除非在严格模式下使用,否则letstatic不是关键字列表的一部分。

在严格模式代码中letstatic通过静态语义限制而不是词法语法被视为保留关键字

最新更新