为何在JavaScript中省略变量名使用var/const声明会触发语法错误,而let不会?
为何在JavaScript中省略变量名使用var/const声明会触发语法错误,而let不会?
这个问题看起来有点反直觉对吧?其实核心原因是JavaScript的语法解析规则对这三个关键字的处理方式不一样,咱们一点点拆解:
一、为什么var = 1和const = 1会报错?
var和const是JavaScript里专门用于变量声明的关键字,它们的语法规则非常明确:必须遵循「关键字 + 变量名(可选赋值)」的结构。比如var num = 1或者const PI = 3.14才是合法的写法。
当你写var = 1或者const = 1时,相当于只写了声明关键字,却没有给变量指定名字——这完全不符合JS的语法规范,引擎会直接抛出SyntaxError,告诉你这里的语法结构有问题,不该直接跟等号。
二、为什么let = 1不会报错?
这情况就有点特殊了:这里的let并没有被JS引擎当成声明关键字来解析!
因为在let = 1这个语句里,let出现在了赋值表达式的左侧,这个位置需要的是一个标识符(也就是变量名),所以引擎会把let当作一个普通的变量名来处理。
在非严格模式下,JavaScript有一个“隐式全局变量”的特性:如果你给一个从未声明过的变量赋值,JS会自动在全局作用域创建这个变量。所以let = 1实际上是在给全局作用域里的let变量赋值,自然不会触发语法错误。
不过要是开启了严格模式(在代码顶部添加'use strict';),这种写法就会报错了,因为严格模式禁止给未声明的变量赋值:
'use strict'; let = 1; // Uncaught ReferenceError: assignment to undeclared variable let
总结一下
var和const在var = 1/const = 1的写法里被当作声明关键字,但缺少必要的变量名,违反语法规则,所以报错;let = 1里的let被当作普通变量名,在非严格模式下隐式创建了全局变量,因此没有语法错误。
备注:内容来源于stack exchange,提问作者Jafarl1
相关产品推荐
相关产品推荐

