为什么没有
let=0

显示任何语法错误,但
var=0

呢? (我在Safari上测试)
但是我试过了
console.log(let)

但是它有错误,似乎“让”#39;不是已定义的变量。为什么会这样?
答案 0 :(得分: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),因为当然在该规范之前没有严格模式代码存在#39}采用,所以他们可以这样做。 (没有保留自那以后最后成为关键字的每个单词,所以有时他们确实必须非常仔细地定义事物。例如,async
即使在严格模式下,它也是一个完全有效的标识符,但在function
之前具有特殊含义。)
"use strict";
let = "I'm an identifier"; // SyntaxError: Unexpected strict mode reserved word
console.log(let);

答案 1 :(得分:3)
var
是保留字,不能是全局变量的名称。但let
也是一个保留字。它与var
的不同之处在于它可以用作变量名。
let
。为了与旧代码(可以将变量名称为let
)兼容,将其用作名称仍然是正确的。从Javascript的开头添加了var
,所以为什么不允许这样做。
let = 0;
console.log(let);
答案 2 :(得分: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 ,表示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
。这是清单:
implements,interface,let,package,private,protected,public, 静态,产量
FutureReservedWord关键字未在非严格JavaScript中强制执行。但在严格模式下,它们被视为保留字,将它们用作变量名称是非法的。
了解更多here
因此,如果不是严格模式,您可以将let
用作变量名称。但var
始终是保留关键字。
所以你可以做点什么
var let = "some thing uneasy!";
console.log(let);

但你还是做不到
let let = 5;

因为词汇上它不正确。 JS假定它是多个声明,如果你用逗号分隔你的声明,你不应该重复let。要么从每个声明中删除let,要么使用分号代替。
答案 3 :(得分:1)
此问题已得到解答,只是添加到其中 -
根据spec,let
和static
不属于关键字列表,除非在严格模式中使用。
在严格模式代码中,
let
和static
被视为保留关键字 通过静态语义限制而不是词汇语法。