javascript - 为什么允许“让”作为变量名?
问题描述
我想知道是否有人可以将焦点放在我刚刚发现的一些奇怪行为上。因此,我在节点 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 = 5
上var let = 5
(至少对我而言)所有这些语句都应该是语法错误时起作用?
编辑要添加,let
在分配后用于分配变量时仍然有效。例如
let = 5;
let test = {};
console.log(let,test)
作品和展示5 {}
解决方案
const
并let
已在ECMA2011中作为未来保留字引入。
ECMA2011 - 引入const
和let
作为未来保留字
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 对关键字的要求const
比let
从一开始就更严格。虽然自 ECMA2012 以来let
可能不再用作标识符,但我认为由于向后兼容性,它被忽略了。
这是 和 的最新let
规范const
。
推荐阅读
- unity3d - 我如何防止运动学对象不通过另一个刚体对象
- excel - Excel VBA通过单击形状更改形状的背景图像
- python - 如何加载html页面然后抓取页面
- html - 如何限制特定输入标签的自动填充?
- sql - 面临 SQL 查询中和/或子句的逻辑处理顺序问题
- apache-spark - Apache Spark 在准备好的语句中读取 Cassandra 混合列
- node.js - 逐行读取文件中的时间范围并分配给nodejs中的变量
- java - 在查询数据库时将列表转换为逗号分隔的字符串以传递 SQL 的最佳方法是什么?
- spring-boot - 通过 GCP pubsub 发布消息时出现异常
- reactjs - 在 React Js 中管理多个 HTTP 请求操作