为何ECMAScript 2019(ES10)关键词列表未包含let?
为什么ES10中let可用于词法声明,但不在全局关键字列表里?
这个问题问得很细致啊!其实这涉及到ECMAScript规范里对关键字的分类逻辑和语法解析的设计:
let是上下文相关关键字,而非全局保留关键字
在ECMAScript规范中,关键字被分成两类:全局保留关键字和上下文相关关键字。let(包括const、async这类)属于后者——它并不会出现在第11.6.2.1节的通用Keyword列表里,因为它只有在特定的语法位置才会被解析为关键字。规范通过语法结构直接定义let的作用
第13.3.1节的LexicalDeclaration(词法声明)语法规则中,直接把let作为该语法结构的起始标记(规则定义为LexicalDeclaration : LetOrConst BindingList,其中LetOrConst只能是let或const)。这意味着当解析器在词法声明的位置遇到let时,会立刻将其识别为关键字,触发词法绑定的逻辑;而如果在其他不允许的位置尝试使用let作为标识符(比如var let = 10;),ES6+环境会报错,这是因为规范的语义规则明确禁止了这种用法,而非它在全局关键字列表中。设计初衷是兼容旧代码
这种上下文相关的设计最初是为了兼容ES6之前的旧代码——有些早期代码可能使用了let作为变量名(虽然并不普遍),通过上下文解析的方式,旧代码里的let作为普通标识符时不会被当作关键字处理,从而实现向下兼容。尽管ES6及以后已经禁止将let用作标识符,但它的语法分类依然保持为上下文相关关键字,所以不会出现在通用的Keyword列表中。
内容的提问来源于stack exchange,提问作者lazyboy
相关产品推荐
相关产品推荐

