为什么要为变量“let”赋值?

为什么要为变量“let”赋值?

问题描述:

我参加了一个在线JS课程,教师使用语法:let = names = ["Bob","Tim","Larry"]。我确信这是一个意外,但不知何故,他正在使用JS环境。他最终做了什么(可能是偶然)将数组分配给了“names”变量,该变量将其分配给“let”变量。为什么要为变量“let”赋值?

我的问题:为什么这不是一个错误?为什么“let”可以用作变量?我们知道“让”是一个关键字。还是仅仅是他们还没有被禁止的东西呢?您仍然可以在Chrome和Firefox控制台中...以及在Node中执行此操作。

+0

有趣的一点。 'let = 123'是允许的,并且会创建一个全局范围变量123,但是'var = 123'会产生一个错误。 – cars10m

+0

在'let = 123'工作的环境中,'let foo = 123';也工作?你可以在同一个脚本中做两个吗? – JeffUK

+0

由于某些原因,他们没有将其包含在保留关键字列表中。实际上你甚至可以做'var let ='something''并且它可以工作,但是为了避免第一个问题(意外地分配一个全局变量而不是初始化一个名为数组的数组,你可以在开头添加''use strict''你的脚本。 –

在ES3和较早的JavaScript版本中,let没有任何特殊含义,可以用作标识符。然而,const已经在未来的保留字列表中。见http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition,%20December%201999.pdf,7.5.1 保留字

ES5增加了“严格模式”。 const仍然是未来的保留字和let名单上就像是在严格模式未来的保留字被处理:http://www.ecma-international.org/ecma-262/5.1/index.html#sec-7.6.1

ES6给了一个意义constlet,但let仍然不是保留字。相反,它说,在http://www.ecma-international.org/ecma-262/6.0/#sec-keywords

strict mode codeletstatic是通过静态语义限制保留关键字处理(见12.1.113.3.1.113.7.5.114.5.1),而不是词法。

换句话说,在严格模式之外,您可以使用let作为变量名称并声明其他变量。

原因let未作为保留字可能不会破坏现有的代码,可能已使用let作为正常标识符。

由于向后兼容性问题,它不在您的浏览器正在实施的EcmaScript版本的保留关键字列表中。您可以在现代浏览器的.js文档中使用'use strict'来退出此行为。至于未来将保留哪些关键字的列表,但最有可能在今天的浏览器中仍未保留的列表,请查看此列表:JavaScript List of Reserved Keywords。请注意,标记为*的是ES5 - ES6特定的关键字,这意味着这些关键字可能稍后会添加到实际列表中。

请注意,const是在较早的阶段添加的,因此它是今天的保留关键字并且正确实施。