为什么JavaScript中可以将let作为变量名定义或重新赋值?
底层原因
你观察到的let可以被重定义的现象,仅能在JavaScript非严格模式(松散模式)下复现,本质是ECMAScript标准为了向下兼容历史版本做的特殊规则设计,核心逻辑如下:
- ES3是早期被广泛落地的JavaScript标准,该版本的保留字列表中完全没有
let,也就是说在ES3规范中let是合法的普通标识符,大量2015年之前的老代码中存在把let作为变量名使用的逻辑。 - 2015年发布的ES6(ES2015)正式将
let列为关键字,用于块级作用域变量声明。为了避免老代码直接报错无法运行,TC39委员会做了兼容设计:非严格模式下不会把let识别为禁止用作变量名的保留字,仅在严格模式下才会强制将let作为关键字处理,禁止重定义或作为变量名。 - 你提到的
while、const、var等关键字,从ES3开始就属于正式保留字,无论是否开启严格模式都不允许作为变量名或赋值目标,因此无法重定义。
补充验证
你可以在测试代码的第一行添加'use strict'开启严格模式,此时运行你的测试代码会直接抛出语法错误:Uncaught SyntaxError: Unexpected strict mode reserved word,和其他关键字的表现完全一致。
内容的提问来源于stack exchange,提问作者flyingturtles
相关产品推荐
相关产品推荐

