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

时间:2018-02-26 09:31:58

标签: javascript

为什么没有



let=0




显示任何语法错误,但



var=0




呢? (我在Safari上测试)

但是我试过了



console.log(let)




但是它有错误,似乎“让”#39;不是已定义的变量。为什么会这样?

4 个答案:

答案 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的不同之处在于它可以用作变量名。

ES6版本中添加了

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)

此问题已得到解答,只是添加到其中 -

根据specletstatic不属于关键字列表,除非在严格模式使用

  

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