严格模式下JavaScript在语法解析阶段就拒绝保留字作标识符:关键字(如class、function)、字面量(null/true/false)、严格模式额外保留字(implements/interface等)及模块中await均不可用,否则直接SyntaxError。

严格模式下,JavaScript 会直接拒绝用保留字作为变量名、函数名或参数名——不是运行时报错,而是语法解析阶段就报 SyntaxError,根本无法执行。这不是靠运行时检查,而是语言引擎在读代码时就拦住你。
哪些词绝对不能当变量名
以下三类词在任何模式(包括严格模式)下都禁止用于标识符:
-
关键字:如
class、function、return、if、for、const、let、import、export等; -
字面量:
null、true、false; -
严格模式额外保留字:如
implements、interface、package、private、protected、public、static、yield、enum(即使当前未启用 ES6+ 特性,也不能用); -
模块上下文保留字:
await(在模块文件中,无论是否严格模式,都不能用作变量名)。
严格模式如何强化保留字限制
非严格模式下,部分未来保留字(如 yield、enum)可能不报错;但一旦启用 "use strict",它们立刻变成非法标识符。例如:
错误写法(严格模式下直接 SyntaxError):
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
立即学习“Java免费学习笔记(深入)”;
"use strict"; let yield = 42; // ❌ 报错:Unexpected strict mode reserved word const enum = ['a']; // ❌ 报错:Unexpected token let package = 'v1'; // ❌ 报错
注意:yield 在非严格模式的普通函数里虽不报错,但在生成器函数内是语法关键字,所以无论如何都不该用作变量名。
怎么避免踩坑
- 命名时避开规范列表里的全部单词——别猜“这个好像没被用”,一律视为禁区;
- 编辑器开启 ESLint 并配置
no-reserved-keys和no-shadow-restricted-names规则,实时标红提醒; - 用
let或const声明变量,避免var的历史包袱,同时配合严格模式双重保险; - 遇到
Unexpected token或Unexpected strict mode reserved word错误,优先检查最近写的变量/参数名是否撞上了保留字。
常见误区提醒
有人以为加了引号就能绕过,比如 obj["class"] = "btn" 是合法的——这没错,因为这是属性访问,不是标识符声明。但下面这些全是非法的:
let class = "A";function default() {}const true = 1;-
function* yield() {}(yield在生成器中是关键字,不可重定义)
只要出现在声明位置(let/const/function 后、参数列表中、解构赋值左侧),就触发语法错误。

















