为何用let作var声明的变量名无报错,用var作let声明的变量名却报错?
为什么
var let = "Hi"合法但let var = "Hi"报错? 先看你给出的代码:
var let = "Hi"; console.log(let); // 输出 "Hi" let var = "Hi"; console.log(var); // 语法错误
核心原因是JavaScript对不同保留关键字的限制规则不一样:
var是「永久硬保留关键字」:不管你用什么声明方式(var/let/const)、处于什么模式(严格/非严格),var都绝对不能用作变量名。它属于JavaScript语法的核心保留字,任何把var当作标识符的尝试都会直接触发语法错误,所以let var = "Hi"连语法检查都通不过。let是ES6新增的保留关键字,但有兼容性例外:
在非严格模式下,用var声明let作为变量名是被允许的——这是ES6规范特意留的兼容性口子,防止旧代码因为ES6新增关键字突然报错。但这种写法是不推荐的,而且一旦切换到严格模式,或者用let/const去声明let作为变量名,同样会报错:'use strict'; var let = "Hi"; // 严格模式下触发语法错误 let let = "Hi"; // 任何模式下都报错
简单来说,var是碰都不能碰的硬禁忌,而let的限制在非严格模式下用var声明时存在一个兼容例外,但这只是历史遗留的特殊情况,不是规范推荐的用法。
内容的提问来源于stack exchange,提问作者Toban Harnish
相关产品推荐
相关产品推荐

