首页 > 解决方案 > 为什么允许“让”作为变量名?

问题描述

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

let = 5; //works
var = 5; //SyntaxError: Unexpected token "="
const = 5; //SyntaxError: Unexpected token "="

let let = 5; //SyntaxError: let is disallowed as a lexically bound name
var let = 5; //works
const let = 5; //SyntaxError: let is disallowed as a lexically bound name

let var = 5; //SyntaxError: Unexpected token "var"
var var = 5; //SyntaxError: Unexpected token "var"
const var = 5; //SyntaxError: Unexpected token "var"

let const = 5; //SyntaxError: Unexpected token "const"
var const = 5; //SyntaxError: Unexpected token "const" 
const const = 5; //SyntaxError: Unexpected token "const"  

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

编辑要添加,let在分配后用于分配变量时仍然有效。例如

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

作品和展示5 {}

标签: javascriptvariable-assignment

解决方案


constlet已在ECMA2011中作为未来保留字引入。

ECMA2011 - 引入constlet作为未来保留字

7.6.1.2 未来保留字

以下词在提议的扩展中用作关键字,因此保留以允许将来采用这些扩展的可能性。

未来保留字 ::

  • 班级
  • 枚举
  • 延伸
  • 极好的
  • 常量
  • 出口
  • 进口

以下标记在出现在严格模式代码中时也被视为FutureReservedWords (参见 10.1.1)。在出现FutureReservedWord会产生错误的任何上下文中,在严格模式代码中出现任何这些标记也必须产生等效错误:

  • 工具
  • 私人的
  • 上市
  • 屈服
  • 界面
  • 包裹
  • 受保护
  • 静止的

ECMA2012 - 批准的关键字

后来在ECMA2012中,这两个词都被添加为关键字,可能不会用作标识符

7.6.1.1 关键词

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

关键字 ::

  • 休息
  • 删除
  • 进口
  • 这个
  • 案子
  • 抓住
  • 别的
  • 实例
  • 尝试
  • 班级
  • 出口
  • 类型
  • 继续
  • 最后
  • 新的
  • 变量
  • 常量
  • 为了
  • 返回
  • 空白
  • 调试器
  • 功能
  • 极好的
  • 尽管
  • 默认
  • 如果
  • 转变

虽然const用作标识符在每种模式下都会let引发错误,但只会在严格模式下引发错误,现在使用您的示例仍然是这种情况:

有效的

在没有严格let模式的情况下用作标识符。

(function(){
    //REM: Works
    var let = 5;
    console.log(let);
  })();

无效的

在没有严格const模式的情况下用作标识符。

(function(){
    //REM: Throws an error
    var const = 5;
    console.log(const);
})();

在严格模式下使用let或作为标识符。const

(function(){
    'use strict';
    //REM: Throws an error
    var let = 5;
    console.log(let);
})();

(function(){
    'use strict';
    //REM: Throws an error
    var const = 5;
    console.log(const);
})();

因此,从历史上看,ECMA 对关键字的要求constlet从一开始就更严格。虽然自 ECMA2012 以来let可能不再用作标识符,但我认为由于向后兼容性,它被忽略了。

是 和 的最新let规范const


推荐阅读