为什么不
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 或改用分号。
这个问题已经回答了,只是为了补充一下——
根据规范,除非在严格模式下使用,否则let
和static
不是关键字列表的一部分。
在严格模式代码中,
let
和static
通过静态语义限制而不是词法语法被视为保留关键字。