Javascript 为什么是';让';允许作为变量名吗?

Javascript 为什么是';让';允许作为变量名吗?,javascript,variable-assignment,Javascript,Variable Assignment,我想知道是否有人能把聚光灯对准我刚刚发现的一些奇怪的行为。因此,我在节点REPL中工作,在将代码粘贴到模块中之前运行代码,并且我输入了一个“let=5”的错误(好吧,没有完全填充该行)。我希望这会出错,但REPL接受了它,我可以通过表达式结果和console.logs看到该值。于是我开始修补。我知道在REPL中,没有let/const/var的变量被认为是全局变量,但我想知道的是,为什么REPL允许我们这样分配let?下面我列出了我尝试过的东西(仅在REPL中,没有在模块脚本中尝试过) 那么为什

我想知道是否有人能把聚光灯对准我刚刚发现的一些奇怪的行为。因此,我在节点REPL中工作,在将代码粘贴到模块中之前运行代码,并且我输入了一个“let=5”的错误(好吧,没有完全填充该行)。我希望这会出错,但REPL接受了它,我可以通过表达式结果和console.logs看到该值。于是我开始修补。我知道在REPL中,没有let/const/var的变量被认为是全局变量,但我想知道的是,为什么REPL允许我们这样分配let?下面我列出了我尝试过的东西(仅在REPL中,没有在模块脚本中尝试过)

那么为什么
let=5
var let=5
在逻辑上(至少对我来说)所有这些语句都应该是语法错误时起作用呢

编辑以添加,
在分配变量后用于分配变量时仍能正常工作。例如

let = 5; 
let test = {}; 
console.log(let,test)

工作和显示是JS最近添加的内容,但在添加之前的很长一段时间内,
const
是一个保留关键字(可能是因为它被认为是该语言未来可能添加的内容)


由于
let
过去是一个有效的变量名,这可能是为了向后兼容。

const
let
在中被引入为将来的保留字

ECMA2011-引入
const
let
作为未来保留字 7.6.1.2未来保留字

以下词语用作建议的扩展和扩展中的关键字 因此,保留这些文件,以便将来采用 这些扩展的一部分

未来保留字::

  • 课程
  • 枚举
  • 扩展
  • 超级
  • 常数
  • 导出
  • 导入
以下代币也被视为FutureReservedWord 当它们发生在严格模式代码内时(见10.1.1)。发生 在任何上下文中的严格模式代码中的任何标记 FutureReservedWord的出现将产生一个错误 也会产生一个等效错误:

  • 实施
  • 私人
  • 公开
  • 收益率
  • 接口
  • 套餐
  • 受保护
  • 静态
ECMA2012-批准的关键字 后来,这两个词都被添加为关键字,不能用作标识符

7.6.1.1关键词

以下标记是ECMAScript关键字,不能用作 ECMAScript程序中的标识符

关键词::

  • 中断
  • 删除
  • 导入
  • 这个
  • 案例
  • do
  • 投掷
  • 捕获
  • 其他
  • instanceof
  • 试试看
  • 课程
  • 导出
  • typeof
  • 继续
  • 最后
  • 新的
  • var
  • 常数
  • 用于
  • 返回
  • 无效
  • 调试器
  • 功能
  • 超级
  • 默认值
  • 如果
  • 开关
虽然用作标识符的
const
在每种模式下都会抛出错误,但是
let
仅在处于严格模式时才会抛出错误,现在使用您的示例仍然如此:

有效的 使用
作为标识符,无需严格模式。

(函数(){
//雷姆:工作
var-let=5;
控制台日志(let);

})();
let
声明是该语言最近添加的一种语言,因此为了避免破坏互联网上的未知部分,该语言允许将
let
用作标识符。但不是同时添加了
const
?为什么这种行为不转移到
const
?@Pointy我不得不假设,如果他们觉得有足够的
像那样向后兼容,他们也会对
const
做同样的事情?@cquezel很可能是这样,但我对历史不感兴趣哈哈。这仍然引出了一个问题:为什么let被限制(或者我应该说不允许,
let
或者
const-let
错误地说“let”是不允许的)我明白了,谢谢你们花时间和提供信息使用
let
作为变量名真的很混乱,因为它是一个语言关键字。使用
var
支持它可以与
let
之前的现有代码作为关键字兼容。这个原因不适用于新代码,使用
let
const
的代码必须是新代码,我们对此非常赞赏。这是有道理的,REPL没有处于“严格模式”,所以它没有抱怨轻微的违规行为
let = 5; 
let test = {}; 
console.log(let,test)