为什么要为变量“let”赋值?
我参加了一个在线JS课程,教师使用语法:let = names = ["Bob","Tim","Larry"]
。我确信这是一个意外,但不知何故,他正在使用JS环境。他最终做了什么(可能是偶然)将数组分配给了“names”变量,该变量将其分配给“let”变量。为什么要为变量“let”赋值?
我的问题:为什么这不是一个错误?为什么“let”可以用作变量?我们知道“让”是一个关键字。还是仅仅是他们还没有被禁止的东西呢?您仍然可以在Chrome和Firefox控制台中...以及在Node中执行此操作。
在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给了一个意义const
和let
,但let
仍然不是保留字。相反,它说,在http://www.ecma-international.org/ecma-262/6.0/#sec-keywords:
在strict mode code,
let
和static
是通过静态语义限制保留关键字处理(见12.1.1,13.3.1.1,13.7.5.1和14.5.1),而不是词法。
换句话说,在严格模式之外,您可以使用let
作为变量名称并声明其他变量。
原因let
未作为保留字可能不会破坏现有的代码,可能已使用let
作为正常标识符。
由于向后兼容性问题,它不在您的浏览器正在实施的EcmaScript版本的保留关键字列表中。您可以在现代浏览器的.js
文档中使用'use strict'
来退出此行为。至于未来将保留哪些关键字的列表,但最有可能在今天的浏览器中仍未保留的列表,请查看此列表:JavaScript List of Reserved Keywords。请注意,标记为*
的是ES5 - ES6特定的关键字,这意味着这些关键字可能稍后会添加到实际列表中。
请注意,const
是在较早的阶段添加的,因此它是今天的保留关键字并且正确实施。
有趣的一点。 'let = 123'是允许的,并且会创建一个全局范围变量123,但是'var = 123'会产生一个错误。 – cars10m
在'let = 123'工作的环境中,'let foo = 123';也工作?你可以在同一个脚本中做两个吗? – JeffUK
由于某些原因,他们没有将其包含在保留关键字列表中。实际上你甚至可以做'var let ='something''并且它可以工作,但是为了避免第一个问题(意外地分配一个全局变量而不是初始化一个名为数组的数组,你可以在开头添加''use strict''你的脚本。 –