js中class内部默认启用严格模式,无需也不允许添加"use strict";其内部所有代码均受严格模式约束,如未声明变量赋值报错、this指向更明确、禁止重复参数名等。

JS 中 class 内部默认就是严格模式,不需要也不允许手动加 "use strict"。
class 自动启用严格模式的原因
ES6 规范明确规定:所有 class 声明(包括类声明、类表达式)的内部代码,天然运行在严格模式下。这是语言层面的强制约定,不是可选行为。
- 无需写
"use strict"—— 即使写了也会被忽略,语法上合法但无实际作用 - 类体顶层(如 constructor、method、getter/setter 内部)全部受严格模式约束
- 这种设计避免了开发者遗漏开启,也统一了类的执行环境
自动启用带来的关键变化
你在 class 里写的任何代码,都会直接受到严格模式规则影响:
-
未声明变量赋值直接报错:
this.x = 1合法,但foo = 2(没用let/var/const)会抛ReferenceError -
this 指向更明确:普通函数调用时
this是undefined,不会意外绑定到全局对象 -
禁止重复参数名:比如
constructor(a, a)在 class 内部会直接报SyntaxError -
arguments 与形参分离:修改形参不影响
arguments[i]的值 - 禁用
with和八进制字面量(如010)
和模块的关系一样,但范围更小
就像 ES6 模块(.mjs 或通过 import 加载的脚本)默认严格一样,class 是另一个“自带严格模式”的语法单元。区别在于:
- 模块影响整个文件作用域;
class只影响自身内部(包括所有方法、访问器、静态块等) - 模块外的普通函数仍需手动加
"use strict"才启用;而 class 外的代码不受影响
验证方式很简单
可以这样快速确认 class 确实运行在严格模式下:
class Test {
check() {
// 尝试隐式创建全局变量
undeclared = 'boom'; // 会立即报错:ReferenceError
}
}
new Test().check();
如果没报错,说明你可能在非严格环境(比如旧版浏览器或 script 标签未启用模块)中运行——但现代标准环境下,这段代码一定会中断执行。











